为什么我的测试在运行整个套件时会间歇性地失败?

时间:2016-10-13 17:31:56

标签: ember.js ember-cli

我的一项测试是在运行整个套件时间歇性地失败,但在单独运行时它并没有失败。

我创建了一个非常基本的存储库,其中包含一个可以重现问题的vanilla应用程序: https://github.com/juanazam/ember-cli-test-issue

基本上,我创建了一个带有文本字段和按钮的组件。文本为空时,该按钮被禁用。

当两个测试在输入上使用fillIn助手时会出现问题。

以下是从vanilla应用程序中获取的测试代码:

test('test 1', function(assert) {
  visit('/');

  fillIn('input[type=text]', "Algo");

  andThen(function() {
    assert.equal(currentRouteName(), "index");
  });
});

test('test 2', function(assert) {
  visit('/');

  andThen(function() {
    assert.ok(find('input[type=submit]').is(':disabled'));
  });

  fillIn('input[type=text]', "Algo");

  andThen(function() {
    assert.ok(!find('input[type=submit]').is(':disabled'));
  });
});

正如您所看到的,测试1仅填充输入但不对其执行任何操作。第二个测试测试按钮是否被禁用。

测试2在运行整个套件时间歇性地失败。如果你运行ember test -s它会失败,如果你重新加载浏览器选项卡(重新运行整个套件而不重新启动服务器进程)它会通过。多次运行会发生相同的行为(一次运行失败,下一次运行成功)。

我没有创建旋转复制案例,因为测试运行器的行为方式不同。

2 个答案:

答案 0 :(得分:0)

随着你的应用程序:

ember test将永远失败。

ember test --filter 'test 1'将永远通过。

ember test --filter 'test 2'将始终传递

如果将2个测试功能分成不同的验收测试,ember test将始终通过。

答案 1 :(得分:0)

浏览器中的Qunit首先尝试执行失败的测试。 (我想减少执行最有趣的失败测试的时间。)使用ember -s,您的测试总是按顺序执行,测试失败(我猜测试2失败,因为test1已经填满了您的输入,并且最初没有按预期禁用)。

在第一次测试失败后在浏览器中重新加载qunit时,首先执行失败的test2(然后通过)。

另请查看https://dockyard.com/blog/2014/04/17/ember-object-self-troll。组件定义中可能存在问题,导致test2中意外填充的输入。