![](/img/trans.png)
[英]How to use QTest QBENCHMARK macros result as a parameter in a unit test
[英]Use QTest macros (QVERIFY, QCOMPARE, etc.) in function other than the test function
一般來說,宏QVERIFY
、 QCOMPARE
等不應在測試 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.