Flutter参数化测试插件parameterized_test的使用
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
扩展为特定参数添加测试选项,如skip
或testOn
。
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
更多关于Flutter参数化测试插件parameterized_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用parameterized_test
插件进行参数化测试的示例代码。parameterized_test
插件允许你使用不同的参数集多次运行同一个测试,这在测试具有多种输入组合的功能时非常有用。
首先,确保你的pubspec.yaml
文件中包含了对test
和parameterized_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']);
});
});
}
在这个改进后的例子中,每个测试用例都是一个包含case
、input
和expectedLength
的Map。这样,每个测试都可以直接检查字符串的长度是否与预期的长度匹配,而无需在每个测试中进行条件判断。
希望这能帮助你在Flutter项目中使用parameterized_test
插件进行参数化测试!