我正试图在Flutter项目上创建CI工作流。在这些工作流程中,我必须使用flutter test
运行测试。出于一些技术原因,我希望能够在某些工作流程中使用黄金图像运行测试,而在其他工作流程中,运行测试时忽略所有黄金图像检查。
有办法做到这一点吗?
您可以使用强烈推荐的黄金工具包。
正如这个答案中所描述的,您只需在test/floft_test_config.dart中创建一个具有以下内容的文件:
import 'dart:async';
import 'dart:io';
import 'package:golden_toolkit/golden_toolkit.dart';
Future<void> testExecutable(FutureOr<void> Function() testMain) async {
return GoldenToolkit.runWithConfiguration(
() async {
await loadAppFonts();
await testMain();
},
config: GoldenToolkitConfiguration(
// Currently, goldens are not generated/validated in CI for this repo. We have settled on the goldens for this package
// being captured/validated by developers running on MacOSX. We may revisit this in the future if there is a reason to invest
// in more sophistication
skipGoldenAssertion: () => !Platform.isMacOS,
),
);
}
我提出了自己的解决方案:
-
我创建了一个文件
test/flutter_test_config.dart
,这是一个用于配置测试的特殊dart文件(请参阅flutter_test
(。 -
我从
flutter_test
创建了一个TrivialComparator
的副本,它总是为黄金比较返回成功。我无法重用TrivialComparator
,因为构造函数是私有的(GitHub(。 -
我使用
bool.fromEnvironment
可以从命令行禁用或不禁用goldens检查。
import 'dart:async';
import 'dart:typed_data';
import 'package:flutter_test/flutter_test.dart';
/// A copy of [TrivialComparator] from flutter_test that returns a
/// trivial success.
class TrivialGoldenFileComparator implements GoldenFileComparator {
const TrivialGoldenFileComparator();
static const ignoreGoldens = bool.fromEnvironment('ignore-goldens');
@override
Future<bool> compare(Uint8List imageBytes, Uri golden) {
return Future<bool>.value(true);
}
@override
Future<void> update(Uri golden, Uint8List imageBytes) {
throw StateError('Golden files should not be updated while ignored.');
}
@override
Uri getTestUri(Uri key, int? version) {
return key;
}
}
Future<void> testExecutable(FutureOr<void> Function() testMain) async {
if (TrivialGoldenFileComparator.ignoreGoldens) {
goldenFileComparator = const TrivialGoldenFileComparator();
}
await testMain();
}
如果我运行
flutter test
金人被检查了。
如果我运行
flutter test --dart-define="ignore-goldens=true"
戈尔登夫妇被忽视了。