我刚刚开始一个需要一些跨平台GUI的新项目,我们选择了Qt作为GUI框架.
我们也需要一个单元测试框架.直到大约一年前,我们使用内部开发的C++单元测试框架 - 项目,但我们现在正在转向使用Google Test进行新项目.
有没有人有使用Google Test for Qt-applications的经验?QtTest/QTestLib是更好的选择吗?
我仍然不确定我们想在项目的非GUI部分使用Qt多少 - 我们可能更喜欢在核心代码中使用STL/Boost,并使用基于Qt的GUI的小接口.
编辑:看起来很多人都倾向于QtTest.是否有任何人有经验将其与连续集成服务器集成?此外,在我看来,必须为每个新测试用例处理单独的应用程序会导致很多摩擦.有什么好方法可以解决这个问题吗?Qt Creator是否有一个处理此类测试用例的好方法,或者您是否需要为每个测试用例创建一个项目?
我得到了我的Qt项目,我正在使用Qt Creator.我想对我的所有代码进行单元测试.
但是我在QTestLib框架上相当新,但是每个人都推荐它用于测试基于Qt的源代码.现在我有点困惑如何用app项目构建测试项目.
在这种情况下,你们如何管理测试代码?谢谢.
任何人都可以给我一些QT测试代码的例子和一个用Cmake构建并与CTest一起运行的CMakeLists.txt.我好像找不到任何东西!
-Kurtis
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() …
Run Code Online (Sandbox Code Playgroud) 也许我错过了一些东西,但对我而言,提供QtTest框架的唯一教程让你测试QString类似乎真的很愚蠢.
单元测试的典型用例是....你自己编写的测试类,但没有提到如何在教程中测试不同项目中的类以进行测试,谷歌也让我失望(我真的怀疑复制粘贴类是一种很好的方法).
我甚至翻阅了3本不同的Qt书籍而没有提及QtTest.
我开始用Qt的单元测试系统编写一些测试.
你通常如何组织测试?它是每个模块类的一个测试类,还是用单个测试类测试整个模块?Qt文档建议遵循前一策略.
我想为模块编写测试.该模块只提供了一个将由模块用户使用的类,但是除了测试公共类之外,还有很多其他类中抽象的逻辑,我也想测试它们.
问题是Qt提出的运行测试的方法涉及到QTEST_MAIN
宏:
QTEST_MAIN(TestClass)
#include "test_class.moc"
Run Code Online (Sandbox Code Playgroud)
最终,一个测试程序只能测试一个测试类.为模块中的每个类创建测试项目有点糟糕.
当然,人们可以看看QTEST_MAIN
宏,重写它,并运行其他测试类.但有什么东西可以开箱即用吗?
到目前为止,我手工完成:
#include "one.h"
#include "two.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
TestOne one;
QTest::qExec(&one, argc, argv);
TestOne two;
QTest::qExec(&two, argc, argv);
}
Run Code Online (Sandbox Code Playgroud) 我是Qt和Qt Quick的新手.我正在验证Qt Quick的Qt测试单元测试框架,我无法理解如何运行测试.这就是我所拥有的,我创建了一个具有以下结构的SUBDIRS项目:
ProjectSolution
ProjectSolution.pro
Project
Project.pro
Sources/main.cpp
Resources/qml.qrc/main.qml
ProjectTest
ProjectTest.pro
Sources/main.cpp
Resources/qml.qrc/main.qml
Resources/qml.qrc/tst_gui.qml
Run Code Online (Sandbox Code Playgroud)
"Project"是要测试的应用程序,我的测试用例位于"ProjectTest/Resources/qml.qrc/tst_gui.qml"中.
tst_gui.qml:
import QtQuick 2.5
import QtTest 1.0
TestCase {
name: "UI Testcase"
when: windowShown
function test_button_click() {
mouseClick(click_button, Qt.LeftButton, Qt.NoModifier)
}
function test_key_press() {
keyClick(Qt.Key_Left)
keyClick("a")
}
}
Run Code Online (Sandbox Code Playgroud)
我在"Project/Resources/qml.qrc/main.qml"中有一个ID为"click_button"的Button,我想模拟它.当我运行测试项目时,我收到消息失败:
FAIL! : tst_gui::UI Testcase::test_button_click() Uncaught exception: click_button is not defined
C:\Users\sjayaprakash\Qt Test Projects\Qt Test Validation\QtTestValidation6\QtTestValidation6Test\tst_gui.qml(9) : failure location
Run Code Online (Sandbox Code Playgroud)
我确信我做错了什么.有人可以帮忙吗?
用例是,我有一个Qt应用程序,我想自动进行用户式测试; 也就是说,我想使用keyClicks(),mouseClick()等,但我想在发生这种情况时实际显示Qt应用程序窗口.
我现在遇到的问题是使用QTestLib涉及使用QTEST_MAIN宏而不是自己定义main,所以我永远不会有机会展示()正在测试的小部件.所以,另一种说出这个问题的方法是,有没有办法在使用其主要功能的应用程序上使用QTestLib?
我知道Squish和可能的Testability Driver都能做到这一点,但如果可以在不使用额外工具的情况下获得此功能,那么这将是理想的选择.
在我们的项目中,我们使用QtTestLib进行单元测试.原因是整个项目在可能的情况下已经使用Qt并且它是一个GUI应用程序,因此我们希望能够测试GUI界面.
我们的项目是由MSVC编译的,所以我们不希望每个测试都有一个单独的项目文件,因为它会使解决方案变得混乱.因此,我们为所有测试创建了一个项目.所有测试都应该在CIS上自动进行(持续集成),因此我们尝试使用一些XSLT转换通过XML格式的输出文件将测试插入Hudson.
但似乎测试输出存在问题.如果对所有测试使用单个main(),并且仅向每个测试传输cmd行参数:
#include "MyFirstTest.h"
#include "MySecondTest.h"
int main(int argc, char **argv)
{
int result = 0;
MyFirstTest test1;
result |= QTest::qExec(&test1, argc, argv);
MySecondTest test2;
result |= QTest::qExec(&test2, argc, argv);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后你会得到一个多次重写的结果文件.因此,如果您想使用输出文件(例如xml)稍微自动化它,您将只获得其中的最后结果.所有其他都将被覆盖.
我们已经尝试过这种方法,它不能让你使用像Hudson这样的连续集成系统.所以我的问题是:有没有机会在一个输出文件中附加结果?当然,我们可以使用一些解决方法,例如通过QTest :: qExec()运行每个测试,并使用修改后的参数将结果写入单独的文件,但这似乎不是最好的方法.理想情况下,我希望有一个结果文件与CIS一起使用.
我必须创建一个单元测试.
但首先,我要弄明白该做什么.有一个QtQuick2-App编写,现在我想用GUI进行单元测试.使用GUI进行单元测试的步骤是什么?阅读Qt文档后,我无法创建任何从测试开始的想法.
希望有人可以帮助我.
编辑:我是能够运行一些测试,加入后tst_button.qml
和tst_test.cpp
我的项目(main.cpp中是评论现在).这是正确的方法,还是应该为测试创建一个新项目?如果是,需要什么样的项目?最后一个问题:MainForm
例如,我是否需要建立我的按键?
tst_button.qml
import QtQuick 2.4
import QtTest 1.0
Rectangle{
id: myRec
property var myMainForm: null
TestCase{
name:"ButtonClick"
when:windowShown
function test_init(){
var createMyWindow = "import QtQuick 2.0; MainForm{id:myForm}"
var myMainForm = Qt.createQmlObject(createMyWindow,myRec)
myRec.myMainForm = myMainForm
}
}
}
Run Code Online (Sandbox Code Playgroud)
tst_test.cpp
#include <QtQuickTest/quicktest.h>
QUICK_TEST_MAIN(test)
Run Code Online (Sandbox Code Playgroud) qttest ×10
qt ×9
unit-testing ×6
c++ ×4
qtestlib ×4
qml ×2
cmake ×1
ctest ×1
googletest ×1
gui-testing ×1
qt-creator ×1
qtquick2 ×1