【问题标题】:How can I make "flutter drive" fail on a RenderFlex overflow exception?如何在 RenderFlex 溢出异常中使“颤振驱动”失败?
【发布时间】:2020-01-20 02:50:33
【问题描述】:

我有一个 Flutter 驱动集成测试,它将作为 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 系统在提交时失败,从而引入新的渲染错误。

【问题讨论】:

  • 你能贴出你尝试过的代码块吗
  • 任何产生溢出的测试。制作一个不会因剪辑到父级或设备而呈现的小部件。

标签: testing flutter


【解决方案1】:

在挖掘了 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 测试不可或缺的一部分。必须有更明显和通用的方法来做同样的事情。

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

【讨论】:

    【解决方案2】:

    就这么简单:

    await driver.waitFor(find.text('NONE EXISTENT TEXT TO FAIL THE TEST'));

    哈,刚刚看到这个问题是关于 RenderFlex 的,不确定它是否会起作用,但你明白了要点,会把这个答案留给像我这样想要通过任何测试的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多