Protractor中自动检测测试耦合(随机化测试执行顺序)
Automatically detect test coupling in Protractor (randomizing test execution order)
问题:
我们有相当大的测试代码库。有时,我们不执行所有测试,而是单独或打包执行它们。但是,有时,由于测试相互关联、耦合,我们会看到意想不到的测试失败。例如,一个测试假设有一些数据是由先前的测试创建的 - 运行 这种测试单独会失败。
问题:
是否可以自动检测项目中耦合了哪些Protractor测试?
我们目前的想法是以某种方式随机化测试执行顺序或者从所有可用测试中随机挑选一组测试并检查是否没有失败。因此,另一个问题:是否可以change/randomize量角器测试发现并更改测试执行顺序?
灵感来自 Ned Batchelder 的 "Finding test coupling" blogpost and the Python nose
test runner's nose-randomly
plugin:
Randomness in testing can be quite powerful to discover hidden flaws
in the tests themselves, as well as giving a little more coverage to
your system.
By randomly ordering the tests, the risk of surprising inter-test
dependencies is reduced - a technique used in many places, for example
Google’s C++ test runner googletest.
一个问题是您可能不知道如何耦合测试。如果一个测试引用了另一个测试的一些变量,您可能能够自动找到这些变量,但这只是测试可能耦合的一种方式,可能不是一种可能的情况。
我的第一个想法是单独 运行 它们,看看哪些失败了。问题是,如果你没有在测试之间清理状态,你可能会改变顺序(按照你的建议随机化它们)但是如果测试 50 期望测试 20 设置的数据但是在新顺序中,测试 20 仍然 运行s before test 50... test 50 仍然会通过。您会找到一些但可能不是全部,直到您 运行 以随机顺序多次找到它们。
你没有描述你的应用程序,但我的第二个想法是,如果有一种方法可以在测试之间回到干净的状态,你应该能够找到依赖于其他测试来设置数据的测试。我有点惊讶你还没有这样做,但如果有一个漫长的设置过程必须 运行 安装一个干净的平板等,那可能是一个问题。根据您的系统,您可以在全新安装后为 VM 拍摄快照并将其恢复到 "quickly" 恢复干净,或者您可以回滚 SQL 表等。这真的取决于在您的系统上并且没有关于系统的更多详细信息,很难提供建议。
另一个选择是去找那些编写或维护测试的人,让他们自我识别他们拥有的耦合测试并修复它们。这可能不会找到全部,但这可能是一个半快速的开始。
哦……我又想到一件事了。如果您可以反转 测试执行的顺序,那应该比随机执行要好。使用相反的顺序,没有测试会在它的前任之后 运行,你应该能够一次找到它们。
您可以 运行 通过设置 random
属性 in your config 随机测试(在文件级别)。您还可以设置 salt/seed 以使其可重复随机。
/**
* If true, run specs in semi-random order
*/
random?: boolean,
/**
* Set the randomization seed if randomization is turned on
*/
seed?: string,
您还可以打开 shardTestFiles
(并行测试 运行s),这也应该能很好地说明您的测试的耦合程度。
你试过像下面那样洗牌 "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
});
来源:
问题:
我们有相当大的测试代码库。有时,我们不执行所有测试,而是单独或打包执行它们。但是,有时,由于测试相互关联、耦合,我们会看到意想不到的测试失败。例如,一个测试假设有一些数据是由先前的测试创建的 - 运行 这种测试单独会失败。
问题:
是否可以自动检测项目中耦合了哪些Protractor测试?
我们目前的想法是以某种方式随机化测试执行顺序或者从所有可用测试中随机挑选一组测试并检查是否没有失败。因此,另一个问题:是否可以change/randomize量角器测试发现并更改测试执行顺序?
灵感来自 Ned Batchelder 的 "Finding test coupling" blogpost and the Python nose
test runner's nose-randomly
plugin:
Randomness in testing can be quite powerful to discover hidden flaws in the tests themselves, as well as giving a little more coverage to your system.
By randomly ordering the tests, the risk of surprising inter-test dependencies is reduced - a technique used in many places, for example Google’s C++ test runner googletest.
一个问题是您可能不知道如何耦合测试。如果一个测试引用了另一个测试的一些变量,您可能能够自动找到这些变量,但这只是测试可能耦合的一种方式,可能不是一种可能的情况。
我的第一个想法是单独 运行 它们,看看哪些失败了。问题是,如果你没有在测试之间清理状态,你可能会改变顺序(按照你的建议随机化它们)但是如果测试 50 期望测试 20 设置的数据但是在新顺序中,测试 20 仍然 运行s before test 50... test 50 仍然会通过。您会找到一些但可能不是全部,直到您 运行 以随机顺序多次找到它们。
你没有描述你的应用程序,但我的第二个想法是,如果有一种方法可以在测试之间回到干净的状态,你应该能够找到依赖于其他测试来设置数据的测试。我有点惊讶你还没有这样做,但如果有一个漫长的设置过程必须 运行 安装一个干净的平板等,那可能是一个问题。根据您的系统,您可以在全新安装后为 VM 拍摄快照并将其恢复到 "quickly" 恢复干净,或者您可以回滚 SQL 表等。这真的取决于在您的系统上并且没有关于系统的更多详细信息,很难提供建议。
另一个选择是去找那些编写或维护测试的人,让他们自我识别他们拥有的耦合测试并修复它们。这可能不会找到全部,但这可能是一个半快速的开始。
哦……我又想到一件事了。如果您可以反转 测试执行的顺序,那应该比随机执行要好。使用相反的顺序,没有测试会在它的前任之后 运行,你应该能够一次找到它们。
您可以 运行 通过设置 random
属性 in your config 随机测试(在文件级别)。您还可以设置 salt/seed 以使其可重复随机。
/**
* If true, run specs in semi-random order
*/
random?: boolean,
/**
* Set the randomization seed if randomization is turned on
*/
seed?: string,
您还可以打开 shardTestFiles
(并行测试 运行s),这也应该能很好地说明您的测试的耦合程度。
你试过像下面那样洗牌 "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
});
来源: