gpt4 book ai didi

testing - 如何使 "flutter drive"在 RenderFlex 溢出异常时失败?

转载 作者:行者123 更新时间:2023-11-28 21:36:45 24 4
gpt4 key购买 nike

我有一个 flutter drive 集成测试,它将作为 CI 构建的一部分在各种设备上运行测试。 Flutter Drive 仅在输出中记录异常,但不会使测试失败。当渲染引擎抛出这个 Renderflex 溢出异常时,有什么方法可以强制测试失败吗?

$ flutter drive test_driver/app.dart

I/flutter (20477): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter (20477): The following assertion was thrown during layout:
I/flutter (20477): A RenderFlex overflowed by 1.00 pixels on the bottom.
...
I/flutter (20477): ◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤
I/flutter (20477): ════════════════════════════════════════════════════════════════════════════════════════════════════
00:25 +4: MyTestDriver App (tearDownAll)
00:25 +4: All tests passed!

此异常也不会在应用程序中传播,因此应用程序和“flutter drive”集成测试似乎都无法访问它。

所有搜索都会出现有关如何解决问题的问题,但不会出现有关如何在 CI 构建中将其作为集成测试的一部分进行测试和检测的问题。

理想情况下,测试将返回非零值,并让 CI 系统在引入新渲染错误的提交中失败。

最佳答案

在深入研究 flutter 和 dart 的源代码后,似乎很难将其暴露在运行的集成测试中,因为当检测到问题时,用户代码甚至可能不在堆栈上。

对于希望解决此问题并至少希望将问题作为 CI 构建的一部分来解决的任何人来说,此 hack 可能适用于您的项目。

flutter drive 脚本本身(在我的例子中,根据需要进行更改,当然,将 test_driver/app.dart 更改为您为测试编写的任何内容):

#!/usr/bin/env bash

TEST_COMMAND_LINE="flutter drive test_driver/app.dart"
TEST_COMMAND_LOG="build/flutter_drive.log"

# Just in case other tasks have not already created this
mkdir -p build

${TEST_COMMAND_LINE} | tee ${TEST_COMMAND_LOG}

if [ ${PIPESTATUS[0]} != 0 ]; then
echo "${TEST_COMMAND_LINE} failed. See ${TEST_COMMAND_LOG} for details"
exit 1
fi

以及日志的测试后扫描:

#!/usr/bin/env bash

# Add any errors logged by "flutter drive" here. If the text is found
# in the flutter drive output, this command will return non-zero.
declare -a ERROR_EXPRESSIONS=(
"EXCEPTION CAUGHT BY RENDERING LIBRARY"
)

TEST_COMMAND_LOG="build/flutter_drive.log"

for errorExpression in "${ERROR_EXPRESSIONS[@]}"
do
EXCEPTION_COUNT=`grep "${errorExpression}" ${TEST_COMMAND_LOG} | wc -l`
if [ ${EXCEPTION_COUNT} != 0 ]; then
echo "ERROR: Error expression ${errorExpression} was found in ${TEST_COMMAND_LOG}"
exit 1
fi
done

这是完成工作的最不优雅的方式。理想情况下,flutter drive 会有一些查询来检查最后抛出的异常(就像小部件测试系统对 flutter test 和驱动程序所做的那样),甚至可能作为命令行选项与驱动程序本身集成,以便任何未捕获的异常都无法通过集成测试。

这可能对面临同样问题的其他人有所帮助,但肯定有更好的方法。这感觉就像是针对某些项目的特定 hack,应该是使用 Flutter 和 Dart 进行测试不可或缺的一部分。必须有更明显和通用的方法来做同样的事情。

这解决了我自己的问题,特别是,但如果更有知识的人可以与我们其他人分享如何正确地做到这一点,那就太好了! :)

关于testing - 如何使 "flutter drive"在 RenderFlex 溢出异常时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58004750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com