Dmi*_*ank 15 c++ qt unit-testing qttest
Qt附带QTest,并且有一些文档:例如,官方教程.
但是,QTest鼓励您将单元测试组织为单独的可执行文件.有一个特殊的宏,它生成main():QTEST_MAIN()
说实话,我真的不喜欢这种方法:通常,一次运行所有测试更有用,以确保最近的更改没有破坏任何东西.有时,屏蔽某些测试或执行某些单独测试很有用,但这是一个例外,而不是规则.
所以,我想立刻运行所有测试.好的,我可以编写自己的main(),执行我想要的所有测试,比如说:
int main(int argc, char **argv)
{
int status = 0;
//-- run all tests
{
TestHTCodecISO14230 tc;
status |= QTest::qExec(&tc, argc, argv);
}
{
TestHTDataMsg tc;
status |= QTest::qExec(&tc, argc, argv);
}
return status;
}
Run Code Online (Sandbox Code Playgroud)
它确实运行所有测试,但问题是我没有方便的所有测试摘要.比如说,对于上面的两个测试,我有两个单独的摘要:
********* Start testing of TestHTCodecISO14230 *********
Config: Using QtTest library 5.4.1, Qt 5.4.1 (i386-little_endian-ilp32 shared (dynamic) release build; by GCC 4.6.1)
PASS : TestHTCodecISO14230::initTestCase()
PASS : TestHTCodecISO14230::decode_summary()
PASS : TestHTCodecISO14230::encode()
PASS : TestHTCodecISO14230::decode_encoded()
PASS : TestHTCodecISO14230::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestHTCodecISO14230 *********
********* Start testing of TestHTDataMsg *********
Config: Using QtTest library 5.4.1, Qt 5.4.1 (i386-little_endian-ilp32 shared (dynamic) release build; by GCC 4.6.1)
PASS : TestHTDataMsg::initTestCase()
PASS : TestHTDataMsg::test1()
PASS : TestHTDataMsg::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestHTDataMsg *********
Run Code Online (Sandbox Code Playgroud)
status如果出现错误,返回的事实将非零,这肯定是有帮助的,但如果我也有总结,那将会更有帮助:
Totals: 8 passed, 0 failed, 0 skipped, 0 blacklisted
Run Code Online (Sandbox Code Playgroud)
从我看来,这是不可能的:我找不到以编程方式获取传递,失败,跳过和列入黑名单的测试数量的方法:qExec()只是QTest命名空间中的一个函数,因此,在它之后收集一些额外的信息是不可能的执行.
好吧,有可能解析输出字符串,但是,呃......
对我来说,它看起来很糟糕.QTest作为一个类,然后创建它的实例并为它提供一些测试类可能会好得多.然后,可以从实例收集一些其他信息.
或者,也许我错过了一些东西.
所以,问题是:是否可以获得QTest所有单元测试类的摘要输出?
正如我在评论中写的那样,我将按以下方式构建我的测试类:
class MyTests: public QObject
{
Q_OBJECT
public:
MyTests() : m_executed(0), m_failed(0)
private slots:
[..]
// This function will be called after each test
void cleanup()
{
m_executed++;
if (currentTestFailed()) {
m_failed++;
}
}
// Output the summary of the test execution.
void report() const
{
qDebug() << "Totals:"
<< m_executed - m_failed << "passed,"
<< m_failed << "failed";
}
private:
int m_executed;
int m_failed;
};
Run Code Online (Sandbox Code Playgroud)
如果您有多个MyTests类实例,则可以扩展其API并总结执行结果,从而生成全局测试执行报告.只需使用C++类的全部优势.
| 归档时间: |
|
| 查看次数: |
2195 次 |
| 最近记录: |