变异测试是一种衡量测试质量的技术。
解释:变异测试(或变异分析或程序变异)用于设计新的软件测试和评估现有软件测试的质量
什么是变异测试(自动化)
变异测试涉及以小的方式修改程序。 [1] 每个变异版本都称为变异体,测试通过使原始版本的行为与变异体不同来检测和拒绝变异体。 这叫做杀死变异人。 测试套件是通过它们杀死的变异体的百分比来衡量的。 可以设计新的测试来杀死额外的变异体。
为什么
进行变异测试以检查测试的质量。 当修复一个错误时,会停止它一次。 然而,bug 经常会回来,不了解代码库的人可能会过来把 bug 放回去。 高质量的测试可确保错误不会再次出现。 变异测试有助于确保这一点。
手工变异测试
要测试变异体,需要发挥想象力。 问问自己:可以在现有代码中添加错误而不会使测试失败吗? 如果可以,那么可能有一个变异体。 以这段简单的代码为例。
import 'package:flutter_test/flutter_test.dart';
int add(int a, int b) {
return a + b;
}
void main() {
test('Test add', () {
expect(add(1, 1), 2);
});
}
当然,这个测试通过了。 但是,我们可以很容易地向这段代码中添加一个不会导致测试失败的错误。
int add(int a, int b) {
if (a == 2) {
a = 3;
}
return a + b;
}
这个代码版本是完全错误的,但我们的测试不包括输入排列,因此不会阻止错误的发生。 因此,需要添加更多测试排列。 我们有一个变异体。
void main() {
test('Test add 1+1', () {
expect(add(1, 1), 2);
});
test('Test add 2+2', () {
expect(add(2, 2), 4);
});
}
第二个测试失败了,这提示我们需要修复错误。
import 'package:flutter_test/flutter_test.dart';
int add(int a, int b) => a + b;
void main() {
test('Test add 1+1', () {
expect(add(1, 1), 2);
});
test('Test add 2+2', () {
expect(add(2, 2), 4);
});
}
总结
我们抑制了一个变异体。当然,应该包括更多的输入排列,但这是一个简单的示例,你可以扩展对 Flutter 场景的想象。 例如,如果按钮的颜色是粉红色而不是黑色可以吗? 如果没有,你可能有一个变异体。 在小部件测试中用验证来抑制它,以确保按钮是黑色的。尝试让自己在编写测试时养成这样思考的习惯。通过考虑可能出现的潜在错误并在它们出现之前阻止它们来帮助你改进测试。