[Dart翻译]Dart: 手动突变测试

181 阅读3分钟

本文由 简悦SimpRead 转码,原文地址 flutterfromdotnet.hashnode.dev

阅读Dart中的手动突变测试,提高Dart和Flutter单元和...... 的质量。

突变测试是一种测量你的测试质量的技术。

突变测试(或突变分析或程序突变)用于设计新的软件测试和评估现有软件测试的质量

维基百科

有很多工具可以实现这个过程的自动化,例如Stryker Mutator,但是Dart现在似乎没有一个工具可以实现这个自动化。所以,这篇文章给你一个快速的解释,你可以手动实现类似的技术。这是一个很好的方法,可以帮助你预防bug,提高测试质量。在此阅读Flutter测试

什么是突变测试(自动)?

突变测试包括以小的方式修改程序。[1] 每个突变的版本被称为突变体,测试通过使原始版本的行为与突变体不同而检测和拒绝突变体。这被称为杀死突变体。测试套件是由它们杀死的突变体的百分比来衡量的。可以设计新的测试来杀死更多的突变体。

维基百科

这个想法比它听起来要简单得多。像Stryker Mutator这样的工具将改变你的代码,然后运行你的测试。如果测试没有失败,那么就有一个突变体。该工具将测量你的系统中有多少突变体,并报告一个分数。它突出了你的代码中需要增加额外的测试组合的地方,或 "验证 "和 "期望 "调用。

为什么?

我们做突变测试来检查我们测试的质量。当我们修复一个bug时,我们会停止它一次。然而,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);
  });
}

当然,这个测试通过了。但是,我可以看到,我们可以很容易地在这段代码中添加一个bug,不会导致测试失败。

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的情况展开想象。例如,如果一个按钮的颜色是粉红色而不是黑色,会不会有问题?如果不行,你可能有一个突变体。在widget test中用verify压制它,以确保按钮是黑色的。试着让自己养成在编写测试时这样思考的习惯。它可以帮助你改善你的测试,通过思考可能出现的潜在bug并在它们出现之前阻止它们。

这里是一个快速提醒的Tweet。如果您能转发,我们将不胜感激! 在Twitter上关注我,了解更多Flutter和Dart的内容。


www.deepl.com 翻译