QTEST_MAIN如何自动设置所有内容以运行测试?
How does QTEST_MAIN set everything up automatically to run tests?
我正在处理一个用C++编写的现有项目,应用程序的入口点是:
QTEST_MAIN(className)
从我读过的文档中,这将创建一个标准的 Cmain()
函数,但根本不清楚如何调用应用程序测试或调用顺序是什么或它的设置方式。
看看我拥有的项目中的类,没有类构造函数;类本身是从QObject派生的。 它有 23 个专用插槽:其中一个称为"initTestCase";其他是各种测试,都以"测试"结尾。
插槽"InitTestCase"包含一个用于设置日志记录过滤器规则的调用,仅此而已。 当项目编译和运行时,它会执行测试,但我看不到顺序的来源或位置。
宏QTEST_MAIN
在我的程序中实际执行什么操作,插槽是如何设置的,它如何知道要执行哪些测试?
QTEST_MAIN转发到一个QTEST_MAIN_IMPL:
#define QTEST_MAIN(TestObject)
int main(int argc, char *argv[])
{
QTEST_MAIN_IMPL(TestObject)
}
此QTEST_MAIN_IMPL因您需要的 QApplication(小部件、GUI 或核心(而异。对于小部件,它看起来像这样:
#define QTEST_MAIN_IMPL(TestObject)
TESTLIB_SELFCOVERAGE_START(#TestObject)
QT_PREPEND_NAMESPACE(QTest::Internal::callInitMain)<TestObject>();
QApplication app(argc, argv);
app.setAttribute(Qt::AA_Use96Dpi, true);
QTEST_DISABLE_KEYPAD_NAVIGATION
TestObject tc;
QTEST_SET_MAIN_SOURCE_PATH
return QTest::qExec(&tc, argc, argv);
QTest::qExec is defined qtestcase.cpp:
int QTest::qExec(QObject *testObject, int argc, char **argv)
{
qInit(testObject, argc, argv);
int ret = qRun();
qCleanup();
return ret;
}
在 qInit(( 中,设置了当前测试对象。
在 qRun(( 中,创建了一个 TestMethods 实例,它的构造函数,我们发现这个循环:
const QMetaObject *metaObject = o->metaObject();
const int count = metaObject->methodCount();
m_methods.reserve(count);
for (int i = 0; i < count; ++i) {
const QMetaMethod me = metaObject->method(i);
if (isValidSlot(me))
m_methods.push_back(me);
}
isValidSlot(( 是这样实现的:
static bool isValidSlot(const QMetaMethod &sl)
{
if (sl.access() != QMetaMethod::Private || sl.parameterCount() != 0
|| sl.returnType() != QMetaType::Void || sl.methodType() != QMetaMethod::Slot)
return false;
const QByteArray name = sl.name();
return !(name.isEmpty() || name.endsWith("_data")
|| name == "initTestCase" || name == "cleanupTestCase"
|| name == "init" || name == "cleanup");
}
最后,调用TestMethods::invokeMethod((,它首先显式检查initTestCase
并运行它:
QTestResult::setCurrentTestFunction("initTestCase");
if (m_initTestCaseDataMethod.isValid())
m_initTestCaseDataMethod.invoke(testObject, Qt::DirectConnection);
同样,它会在最后检查cleanupTestCase
。
相关文章:
- QTEST_MAIN如何自动设置所有内容以运行测试?
- 如果所有部分都失败,Catch2 将再次运行测试
- cmake googletest不运行测试,没有输出
- 单位测试.如何在Main()中运行测试
- Google Test with CLion 未运行测试
- C++ CppUnitTestFramework 在构建后运行测试
- 运行测试时如何考虑依赖关系?
- 在 Travis CI 上运行 C++ 测试时出现问题.Cmake 配置.如何在特拉维斯 ci 上运行测试套件?
- 在 Visual Studio 中多次运行 C++ 项目 main()
- 如何在Xcode中的C++程序上运行测试输入
- 是否可以在已经有主函数的cpp文件上运行测试
- 无法在 CppUnitTestFramework (VS2013) 中运行测试
- 如何从Chromium运行测试代码?
- 无法在mesos上运行测试框架
- 用于运行测试和浏览报告的Eclipse (CDT)插件
- 更改源后自动运行测试
- 未能设置运行测试的执行上下文
- Googletest:如何异步运行测试
- 在没有测试框架的情况下使用c++在Appveyor中运行测试
- CMake 和 CTest:自动运行测试的依赖项