Flutter参数化测试插件parameterized_test的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter参数化测试插件parameterized_test的使用

目录

特性 ✨

  • ✅ 根据提供的参数列表多次运行测试。
  • ✅ 基于 dart test package 构建。
  • ✅ 测试中使用的参数类型转换。
  • ✅ 为parameterizedTest添加测试选项。
  • ✅ 每个参数可以包含自己的测试选项。

安装 🛠

pubspec.yaml文件中添加以下内容:

dev_dependencies:
  parameterized_test: ^latest_version

用法 ⚡️

通过提供参数列表,可以用相同的测试函数运行多次。例如:

parameterizedTest(
  'Fruit name matches length',
  [
    ['kiwi', 4],
    ['apple', 5],
    ['banana', 6],
    ['pineapple', 9],
  ],
  (String fruit, int length) {
    expect(fruit.length, length);
  },
);

此代码将创建一个包含四个测试的组,每个测试都使用提供的参数运行测试函数。

添加测试选项到参数 🔩

可以通过使用options扩展为特定参数添加测试选项,如skiptestOn

parameterizedTest(
  'Fruit name matches length',
  [
    ['kiwi', 4],
    ['apple', 5].options(skip: 'Apple is not ripe yet'),
    ['banana', 6],
    ['pineapple', 9],
  ],
  (String fruit, int length) {
    expect(fruit.length, length);
  },
);

更改测试描述输出 📝

可以通过定义customDescriptionBuilder来自定义测试描述输出。

parameterizedTest(
  'Example of custom description',
  [
    ['first', 'second', true],
    ['third', 'fourth', false],
  ],
  (String value1, String value2, bool expected) {
    expect(value1 != value2, expected);
  },
  customDescriptionBuilder: (groupDescription, index, values) => '🚀[$index] $groupDescription: <<${values.join('|')}>>',
);

示例 📦

简单的单值列表测试

parameterizedTest(
  'Example of list of single values',
  [
    1,
    2,
    3,
  ],
  (int value) {
    final result = value < 4;
    expect(result, true);
  },
);

多值列表测试

parameterizedTest('Example of list of multiple values', [
  [0, 1, 1],
  [1, 1, 2],
  [1, 2, 3],
  [2, 2, 4],
], (int value1, int value2, int sum) {
  expect(value1 + value2, sum);
});

复杂对象列表测试

parameterizedTest('Example of a list with complex object', [
  [DateTime(2024, 4, 12), 5],
  [DateTime(1969, 7, 20), 7],
], (DateTime dateTime, int expectedWeekday) {
  expect(dateTime.weekday, expectedWeekday);
});

枚举列表测试

enum FruitEnum {
  kiwi(4),
  apple(5),
  banana(6),
  pineapple(9);

  const FruitEnum(this.wordLength);

  final int wordLength;
}

parameterizedTest(
  'Example using enum as value',
  FruitEnum.values,
  (FruitEnum testEnum) {
    expect(testEnum.name.length, testEnum.wordLength);
  },
);

从函数获取值列表的测试

List<dynamic> provideData() {
  return [
    [0, 1, 1],
    [1, 1, 2],
    [1, 2, 3],
    [2, 2, 4],
  ];
}

parameterizedTest(
  'Example of list of values from function',
  provideData(),
  (int value1, int value2, int sum) {
    expect(value1 + value2, sum);
  },
);

带有setup和teardown的简单测试

parameterizedTest(
  'Example with setup and teardown ',
  [
    ['kiwi', 4],
    ['apple', 5],
    ['banana', 6],
  ],
  (String word, int length) {
    expect(word.length, length);
  },
  setUp: () {
    print('Setup everything I need for testing');
  },
  tearDown: () {
    print('tear it down again');
  },
);

异步测试

parameterizedTest(
  'Example using a async test',
  [
    100,
    200,
    300,
  ],
  (int value) async {
    final millis = DateTime.now().millisecondsSinceEpoch;
    await Future<void>.delayed(Duration(milliseconds: value));
    final passed = DateTime.now().millisecondsSinceEpoch - millis;

    expect(passed >= value, true);
  },
);

CSV数据测试

parameterizedTest('Example of CSV data',
  const CsvToListConverter().convert('kiwi,4\r\napple,5\r\nbanana,6'),
  (String fruit, int length) {
    expect(fruit.length, length);
});

附加信息 💡

parameterized_test是一个简单的包装器,用于轻松地多次执行不同值的测试。欢迎提出反馈或提交拉取请求。


更多关于Flutter参数化测试插件parameterized_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter参数化测试插件parameterized_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用parameterized_test插件进行参数化测试的示例代码。parameterized_test插件允许你使用不同的参数集多次运行同一个测试,这在测试具有多种输入组合的功能时非常有用。

首先,确保你的pubspec.yaml文件中包含了对testparameterized_test的依赖:

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  test: ^1.20.0  # 确保版本是最新的
  parameterized_test: ^0.2.0  # 确保版本是最新的

然后,运行flutter pub get来安装这些依赖。

接下来,在你的测试文件中(通常位于test/目录下),你可以这样使用parameterized_test

import 'package:test/test.dart';
import 'package:parameterized_test/parameterized_test.dart';

void main() {
  // 定义一个参数集
  var testCases = <Object>[
    'empty string', '',
    'single character', 'a',
    'multiple characters', 'hello',
    'special characters', '!@#$%',
  ];

  // 使用parameterized_test运行参数化测试
  parameterizedTest('test string length', testCases, (String testCaseName, String input) {
    test(testCaseName, () {
      // 这里是你实际的测试逻辑
      expect(input.length, isA<int>());
      if (input == '') {
        expect(input.length, 0);
      } else if (input == 'a') {
        expect(input.length, 1);
      } else if (input == 'hello') {
        expect(input.length, 5);
      } else if (input == '!@#$%') {
        expect(input.length, 5);
      }
    });
  });
}

在这个例子中,我们定义了一个包含多个字符串测试用例的参数集testCases。然后,我们使用parameterizedTest函数来为每个参数运行一个测试。每个测试都会检查字符串的长度是否符合预期。

然而,上面的例子并不是最高效的方式来处理这种情况,因为每个测试实际上都在做相似的事情。我们可以改进测试逻辑,使其更加通用:

import 'package:test/test.dart';
import 'package:parameterized_test/parameterized_test.dart';

void main() {
  // 定义一个参数集,每个元素是一个包含测试用例名称和预期长度的Map
  var testCases = [
    {'case': 'empty string', 'input': '', 'expectedLength': 0},
    {'case': 'single character', 'input': 'a', 'expectedLength': 1},
    {'case': 'multiple characters', 'input': 'hello', 'expectedLength': 5},
    {'case': 'special characters', 'input': '!@#$%', 'expectedLength': 5},
  ];

  // 使用parameterized_test运行参数化测试
  parameterizedTest<Map<String, dynamic>>('test string length', testCases, (String testCaseName, Map<String, dynamic> params) {
    test(params['case']!, () {
      // 这里是你实际的测试逻辑
      expect(params['input']!.length, params['expectedLength']);
    });
  });
}

在这个改进后的例子中,每个测试用例都是一个包含caseinputexpectedLength的Map。这样,每个测试都可以直接检查字符串的长度是否与预期的长度匹配,而无需在每个测试中进行条件判断。

希望这能帮助你在Flutter项目中使用parameterized_test插件进行参数化测试!

回到顶部