深色模式
Flutter 单元测试
起步
yaml
dev_dependencies:
flutter_test:
sdk: flutter
举例
为Counter
类,写单元测试:
dart
class Counter {
int _count = 0;
int get count => _count;
void increment() {
_count++;
}
void decrement() {
if (_count > 0) _count--;
}
void reset() {
_count = 0;
}
}
dart
import 'package:test/test.dart';
import 'counter.dart';
void main() {
// 定义一个 Counter 变量
late Counter counter;
// 在所有测试之前运行一次的 setupAll 函数
setUpAll(() {
print('setUpAll: 在所有测试之前运行一次');
// 这里可以进行一些全局性的初始化操作
});
// 在每个测试之前运行的 setup 函数
setUp(() {
print('setUp: 在每个测试之前运行');
counter = Counter(); // 初始化 Counter 对象
});
// 测试 increment 方法
test('测试 increment 方法', () {
counter.increment();
expect(counter.count, equals(1));
});
// 测试 decrement 方法
test('测试 decrement 方法', () {
counter.increment();
counter.decrement();
expect(counter.count, equals(0));
});
// 测试 reset 方法
test('测试 reset 方法', () {
counter.increment();
counter.increment();
counter.reset();
expect(counter.count, equals(0));
});
// 在每个测试之后运行的 tearDown 函数
tearDown(() {
print('tearDown: 在每个测试之后运行');
counter.reset(); // 将计数器重置为初始状态
});
// 在所有测试之后运行一次的 tearDownAll 函数
tearDownAll(() {
print('tearDownAll: 在所有测试之后运行一次');
// 这里可以进行一些全局性的清理操作
});
}
初始化函数
setUp
:在每个测试开始前,执行一次setUpAll
:在所有测试开始前,执行一次tearDown
:在每个测试结束后,执行一次tearDownAll
:在所有测试结束后,执行一次
常用断言函数
核心函数:expect
expect(actual, matcher, {reason, skip})
作用: 检查实际值 (
actual
) 是否符合给定的匹配器 (matcher
)。使用场景: 这是最常用的断言函数,用于验证一个值是否符合预期。
示例:
darttest('expect example', () { var result = 42; expect(result, equals(42)); // 检查 result 是否等于 42 });
常用Matcher
equals
:
检查测试值是否等于某个期望值。
dart
expect(5, equals(5)); // Passes
isTrue
/isFalse
:
检查布尔值是否为真/假。
dart
expect(true, isTrue); // Passes
expect(false, isFalse); // Passes
isNull
/isNotNull
:
检查对象是否为null或非null。
dart
expect(null, isNull); // Passes
expect('not null', isNotNull); // Passes
isA<T>()
:
检查对象是否是特定类型。
dart
expect('hello', isA<String>()); // Passes
expect(5, isA<int>()); // Passes
isEmpty
/isNotEmpty
:
检查集合是否为空或非空。
dart
expect([], isEmpty); // Passes
expect([1, 2, 3], isNotEmpty); // Passes
contains
:
检查集合中是否包含某个元素。
dart
expect('hello world', contains('world')); // Passes
expect([1, 2, 3], contains(2)); // Passes
throwsA
:
用于测试期望抛出某种异常。
dart
expect(() => throw Exception('Error'), throwsA(isA<Exception>())); // Passes
集合相关Matcher
listEquals
:
检查List
中的元素是否按顺序和值相等。
dart
expect([1, 2, 3], listEquals([1, 2, 3])); // Passes
setEquals
:
检查集合中的元素是否相等,不考虑顺序,因为Set
本身就是无序的。
dart
expect({1, 2, 3}, setEquals({3, 2, 1})); // Passes
unorderedEquals
:
用于List
,检查列表中的元素是否相等,但不考虑顺序。
dart
expect([1, 2, 3], unorderedEquals([3, 2, 1])); // Passes
数字相关Matcher
closeTo
:
用于浮点数比较,检查数值是否在某个范围之内。
dart
expect(10.0, closeTo(10.1, 0.1)); // Passes
greaterThan
/lessThan
/greaterThanOrEqualTo
/lessThanOrEqualTo
:
数值比较。
dart
expect(5, greaterThan(3)); // Passes
expect(5, lessThan(10)); // Passes
expect(5, greaterThanOrEqualTo(5)); // Passes
expect(5, lessThanOrEqualTo(5)); // Passes
字符串相关Matcher
startsWith
/endsWith
:
检查字符串是否以特定文本开始/结束。
dart
expect('hello world', startsWith('hello')); // Passes
expect('hello world', endsWith('world')); // Passes
matches
:
使用正则表达式匹配字符串。
dart
expect('abc123', matches(RegExp(r'^[a-z]+\d+$'))); // Passes