如何指定测试窗口?
Posted
技术标签:
【中文标题】如何指定测试窗口?【英文标题】:how specify Window for tests? 【发布时间】:2019-05-19 17:30:10 【问题描述】:我需要测试中的屏幕看起来与物理设备(或模拟器)上的相同。我该怎么做?在我的情况下,设备 ID Iphone SE。
我写了一个将屏幕截图保存到磁盘的测试:
testWidgets('test', (WidgetTester tester) async
final AutomatedTestWidgetsFlutterBinding binding = tester.binding;
binding.renderView.configuration = TestViewConfiguration(size: Size(640, 1136));
var widget = Scaffold(
appBar: AppBar(title: Text('title'),),
body: Column(children: <Widget>[
RaisedButton(
child: Text('button'),
onPressed: () ,)
],),
);
var key = new GlobalKey();
await tester.pumpWidget(
MaterialApp(home: RepaintBoundary(key: key, child: widget),),
);
await tester.pumpAndSettle();
await tester.runAsync(() async
RenderRepaintBoundary boundary = key.currentContext.findRenderObject();
var image = await boundary.toImage();
var byteData = await image.toByteData(format: ImageByteFormat.png);
var pngBytes = byteData.buffer.asUint8List();
await File('screen.png').writeAsBytes(pngBytes);
);
);
如果使用带有 devicePixelRatio 的 ViewConfiguration 而不是 TestViewConfiguration,则忽略 devicePixelRatio
如果包装 MaterialApp,MediaQuery 也不起作用
应用栏和按钮比模拟器少
测试屏幕:
但预期(小部件规模):
【问题讨论】:
您可能希望使用matchesGoldenFile
而不是手动进行屏幕截图
【参考方案1】:
你得到的是块而不是文本,因为 Flutter 使用了一种特定的测试字体 (Ahem
),它的所有字符都只是块。
这使得在 Linux (CI) 和其他平台上平等地呈现它们变得更加容易。不知道还有没有其他原因。
我也无法让图像在黄金测试中发挥作用。
https://github.com/flutter/engine/pull/6913 是最近合并的修复程序,允许在测试中加载自定义字体。
当您在真实设备上运行应用程序时,您可以使用 flutter run --use-test-fonts
让 Flutter 使用 Ahem
字体,这样您就可以直观地看到测试的外观。
相关问题
https://github.com/flutter/flutter/issues/24405 https://github.com/flutter/flutter/issues/17910#issuecomment-445184463我不知道以这种方式加载的字体是否适用于黄金测试(它们可能仍然不像图像那样工作)
如果您想指定不同的屏幕尺寸,请参阅(未经本人测试)How to test Flutter widgets on different screen sizes?
不确定这个建议是否还有任何价值。我发现它非常有限,上面的建议可能效果更好)In Flutter Widget testing, how to make media.orientation to portrait?
【讨论】:
好总结!不过,这并不是一个真正的黄金测试 它仍然非常有限,但总比没有好。当渲染由于某种原因发生变化时,我通常会失败。以上是关于如何指定测试窗口?的主要内容,如果未能解决你的问题,请参考以下文章