如何在RenderFlex溢出异常时使“颤振驱动器”失败?

时间:2019-09-19 06:16:12

标签: testing flutter

我有一个颤振驱动器集成测试,它将作为CI构建的一部分在各种设备上运行测试。 Flutter驱动器仅将异常记录在输出中,但不会使测试失败。当渲染引擎抛出此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系统无法通过引入新渲染错误的提交。

1 个答案:

答案 0 :(得分:0)

在仔细研究了颤振和飞镖的源代码之后,似乎很难进行正在运行的集成测试,因为检测到问题后,甚至用户代码可能不在堆栈中。

对于希望解决此问题并至少希望在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 test和驱动程序所做的查询),甚至可能与驱动程序本身集成为命令行选项,因此任何未捕获的异常都将失败集成测试。

这可能会对遇到相同问题的其他人有所帮助,但是肯定有更好的方法。感觉就像针对特定项目的黑客一样,对于使用Flutter和Dart进行测试应该是必不可少的。必须有更明显,更通用的方法来完成相同的事情。

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