簡體   English   中英

如何在 RenderFlex 溢出異常時使“顫振驅動”失敗?

[英]How can I make “flutter drive” fail on a RenderFlex overflow exception?

我有一個 flutter 驅動器集成測試,它將作為 CI 構建的一部分在各種設備上運行測試。 Flutter 驅動器僅在 output 中記錄異常,但未通過測試。 當渲染引擎拋出此 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 驅動器將有一些查詢來檢查最后拋出的異常(就像小部件測試系統對flutter test和驅動程序所做的那樣),甚至可能與驅動程序本身集成為命令行選項,以便任何未捕獲的異常無法通過集成測試.

這可能對面臨同樣問題的其他人有所幫助,但肯定有更好的方法。 對於使用 Flutter 和 Dart 進行測試的東西,這感覺就像是針對特定項目的 hack。 必須有更明顯和通用的方法來做同樣的事情。

這解決了我自己的問題,特別是,但如果有更多知識的人可以與我們的 rest 分享如何正確地做到這一點,那就太棒了::)

就如此容易:

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

哈,剛剛看到這個問題是關於 RenderFlex 的,不確定它是否會起作用,但你明白了要點,會把這個答案留給像我這樣想要在任何測試中失敗的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM