Javascript 自动检测量角器中的测试耦合(随机化测试执行顺序)

Javascript 自动检测量角器中的测试耦合(随机化测试执行顺序),javascript,selenium,testing,protractor,end-to-end,Javascript,Selenium,Testing,Protractor,End To End,问题: 我们有一个相当大的测试代码库。有时,我们不执行所有测试,而是单独或打包执行。但是,有时,由于测试相互关联、相互耦合,我们会看到意外的测试失败。例如,一个测试假设有一些数据是由前一个测试创建的——单独运行此类测试将失败 问题: 是否可以自动检测项目中耦合的量角器测试 我们目前的想法是以某种方式随机测试执行顺序,或者从所有可用测试中随机选取一组测试,并检查是否没有失败。因此,另一个问题:是否可以更改/随机化量角器测试发现并更改测试执行顺序 灵感来源于Ned Batchelder的博客帖子和

问题:

我们有一个相当大的测试代码库。有时,我们不执行所有测试,而是单独或打包执行。但是,有时,由于测试相互关联、相互耦合,我们会看到意外的测试失败。例如,一个测试假设有一些数据是由前一个测试创建的——单独运行此类测试将失败

问题:

是否可以自动检测项目中耦合的量角器测试

我们目前的想法是以某种方式随机测试执行顺序,或者从所有可用测试中随机选取一组测试,并检查是否没有失败。因此,另一个问题:是否可以更改/随机化量角器测试发现并更改测试执行顺序


灵感来源于Ned Batchelder的博客帖子和Python
nose
test runner的:

测试中的随机性对于发现隐藏的缺陷非常有效 在测试本身中,以及对 你的系统

通过对测试进行随机排序,可以降低意外交互测试的风险 减少依赖性——例如,在许多地方使用的一种技术 谷歌的C++测试转发器。
一个问题是您可能不知道测试是如何耦合的。如果一个测试引用了另一个测试中的一些变量,您可能能够自动找到这些变量,但这只是测试耦合的一种方式,可能不太可能出现这种情况

我的第一个想法是单独运行它们,看看哪些失败了。问题是,如果您没有在测试之间清除状态,您可能会更改顺序(如您所建议的那样,将它们随机化),但是如果测试50期望测试20设置的数据以新的顺序运行,那么测试20仍然会在测试50之前运行。。。测试50仍将通过。您将找到一些,但可能不是全部,直到您以随机顺序多次运行它们

您没有描述您的应用程序,但我的第二个想法是,如果有一种方法可以在测试之间恢复原状,那么您应该能够找到依赖其他测试来设置数据的测试。我有点惊讶,你还没有这样做,但如果有一个很长的安装过程,必须运行安装一个干净的板岩等,这可能是一个问题。根据您的系统,您可能能够在干净的安装后对VM进行快照并将其还原为“快速”恢复干净,或者您可能能够回滚SQL表,等等。这实际上取决于您的系统,如果没有关于系统的更多详细信息,则很难提供建议

另一种选择是去找编写或维护测试的人,让他们自行识别自己拥有的耦合测试并修复它们。这可能找不到所有人,但这可能是一个半快速的开始



哦。。。我还想到一件事。如果您可以颠倒测试执行的顺序,那应该比随机化执行要好。如果使用相反的顺序,则不会在前一个测试之后运行任何测试,您应该能够一次性找到所有测试。

通过设置
random
属性,您可以随机运行测试(在文件级)。您还可以设置盐/种子,使其重复随机

/**
 * If true, run specs in semi-random order
 */
random?: boolean,
/**
 * Set the randomization seed if randomization is turned on
 */
seed?: string,
您还可以打开
shardTestFiles
(并行测试运行),这也可以很好地说明测试的耦合程度

您是否尝试过像下面这样洗牌“it”块:

var shuffle = function (items) {
  var item, randomIndex;      
  for(var i = 0; i < items.length; i++){
    randomIndex= (Math.random() * items.length) | 0;
    item = items[i];
    items[i] = items[randomIndex];
    items[randomIndex] = item;
  }
}

describe('Suite', function() {

  it("should a", function () {
      console.log("execute a");
  });

  it("should b", function () {
      console.log("execute b");
  });

  it("should c", function () {
      console.log("execute c");
  });

  shuffle(this.children);    // shuffle the 'it' blocks

});
var shuffle=函数(项目){
var项目,随机指数;
对于(变量i=0;i

来源:

您是否考虑过在测试设置中创建必要的数据?这将删除其他测试中的依赖项。@是的,理想情况下,测试应该相互独立,正确设置和清理,但不幸的是,我们已经遇到了这个问题。另外,如果有一种随机测试执行顺序的方法,那将是我们未来的一大优势。我们将把它作为测试的“隔离测试”。谢谢。总的来说,建议不错,谢谢!颠倒顺序是一个好主意,它不会捕获所有连接的测试,但肯定会显示其中的一些测试。由于测试之间的相互联系差异很大,而且它们几乎都是特定于应用程序的,因此我不得不将问题保持为一般性的。在这里,我主要是想看看我们如何将量角器的执行顺序随机化,但这不仅仅是顺序。理想情况下,我们还希望选择随机的“样本”,测试块并单独运行它们。所有这些都应该增加/检查我们测试的价值和质量..听起来很接近解决随机化问题的部分!谢谢不过,在随机块(不是所有测试,而是随机部分)中运行测试是一个开放的问题。。。可能在测试运行者级别。也许是茉莉花或摩卡咖啡。六羟甲基三聚氰胺六甲醚。。。。我总是尝试运行我的新测试,或者我正在修复的测试,以孤立地运行每个测试。我今天刚把一个测试解耦了事实上。。。通过在每个
清理块之后添加一个
。这似乎很耗时。。。当然,调试一个完整的测试运行不会花费更多的时间:)是的,我理解测试设置和拆卸的理论,在这里,我试图获得更多的观点:“好的,我们已经有了测试耦合,现在,因为有很多测试,是吗