簡體   English   中英

在測試function以外的function中使用QTest宏(QVERIFY、QCOMPARE等)

[英]Use QTest macros (QVERIFY, QCOMPARE, etc.) in function other than the test function

一般來說,宏QVERIFYQCOMPARE等不應在測試 function 之外使用。原因是,在失敗的情況下,它們會中斷測試並return

如果我想在 function 中進行測試,我應該手動進行,如果其中一個失敗則返回 false。 然后使用QVERIFY調用 function。 但是當我這樣做時,我錯過了宏的詳細信息 output,例如發生錯誤的行。

所以我正在尋找一種在測試 function 之外使用宏的方法。一個解決方案是創建我自己的宏,當底層 function 中的宏調用失敗時中斷測試。 這里的主要問題是檢測測試何時失敗。 查看 Qt 的代碼,如果失敗,變量QTest::failed設置為true 但我無權訪問此變量。

有沒有辦法查明 QtTest 宏是否失敗?

是的,Qt 在這里並沒有真正提供任何東西,因為測試不會在您自己的 function 中真正被打斷。控制流不會那么容易被打擾。 您需要拋出異常並確保它被正確捕獲。

我現在正在做的只是返回一個const char* (在使用字符串文字時有效)。 如果 function 實際上返回了一些東西,可以使用std::variant ,例如:

std::variant<MyObject, const char*> createObject() {
    // do some preparations
    if(preparationsFail) {
        return "Error occurred";
    
    // all worked

    // ...: create some myObject 
    return myObject;
}

void MyTest::testFunction() {
    auto result = createObject();
    if(const char** error = std::get_if<const char*>(&result)) {
        QVERIFY2(false, *error); // we get pointer to value, so type is **
    }
    
    // else, work with myObject by std::get<MyObject>(result);
}

沒有預期的那么簡潔,但它確實有效。

它可以通過包裝const char*並根據您的風格使用std::visit等使其更漂亮,但這取決於您和您的風格。

暫無
暫無

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

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