我正在编写一个模拟按键的测试应用程序,我想在每次按键后显示什么窗口.这是代码块.
std::auto_ptr<MyForm> pForm(new MyForm(3,3));
QTest::keyPress(pForm.get(), Qt::Key_0);
Run Code Online (Sandbox Code Playgroud)
在这里按0后,会出现一个窗口,我想查看它是什么窗口,以便我可以稍后进行QCompare /评估.
有任何想法吗?
更新:
我使用时遇到分段错误
std::auto_ptr<MyForm> pForm(new MyForm(3,3));
QTest::keyPress(pForm.get(), Qt::Key_0);
QWidget *pWin = QApplication::activeWindow();
QCOMPARE(pWin->windowTitle(), QString("My Second Menu"));
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用QTest进行一些测试.我有一个QListWidget,我想点击它来获取选择.但点击后,没有选择任何内容.有没有人有任何想法?
这是我的测试课
void TestGui::List() {
TestDialog dlg;
dlg.show ();
// Click on the centre of the second object
QListWidget *list = dlg.ListWidget ();
QListWidgetItem *item = list->item ( 1 );
QRect rect = list->visualItemRect ( item );
QTest::mouseClick ( list, Qt::LeftButton, 0, rect.center() );
// Check if something was selected
QCOMPARE ( list->currentRow (), 1 );
QVERIFY ( list->currentItem () != NULL );
QCOMPARE ( list->currentItem ()->text (), QString ( "Two" ) );
}
Run Code Online (Sandbox Code Playgroud)
以下是测试类
class TestGui: public QObject { …Run Code Online (Sandbox Code Playgroud) 在我们的项目中,我们使用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一起使用.
我正在使用QTestLib框架在QTableView中为自定义Validator编写单元测试.最基本的测试用例之一可以这样描述:
双击第三列和第四行中的表格单元格,并在其内容中附加数字"5".
仅仅改变模型中的值或任何东西是不够的,测试用例应该像这样执行:
注意:这个问题有一个关于如何从代码中将表格单元格设置为编辑模式的答案,但是单元测试应该尝试坚持人类用户的可能性,即鼠标/键盘操作.
我发现可以使用QTableView :: columnViewportPosition(int)和QTableView :: rowViewportPosition(int)检索单元格的X/Y位置.但是,使用QTest :: mouseDClick(...)双击指定位置既不选择单元格也不将其设置为编辑模式:
// Retrieve X/Y coordinates of the cell in the third column and the fourth row
int xPos = m_pTableView->columnViewportPosition( 2 );
int yPos = m_pTableView->rowViewportPosition( 3 );
// This does not work
QTest::mouseDClick( m_pTableView, Qt::LeftButton, QPoint( xPos, yPos ) );
Run Code Online (Sandbox Code Playgroud)
如何使用鼠标/键盘操作实现上述测试用例?
PS:我在Windows XP 32位和Qt 4.6.1下尝试这个
使用QTestLib构建测试时,我得到一个qCompare函数的"未定义符号"错误:
Undefined symbols for architecture x86_64:
"__ZN5QTest8qCompareIimEEbRKT_RKT0_PKcS8_S8_i", referenced from:
__ZN15MyTestClass22myTestFunctionEv in MyTestClass.o
Run Code Online (Sandbox Code Playgroud) 我正在Qt中使用QTest编写一些单元测试.我还遇到了QBENCHMARK宏,它对它封装的代码进行了基准测试.
我正在运行我的单元测试并对一些代码进行基准测试.QBENCHMARK报告执行某些方法需要多长时间,这很好.我想在单元测试中使用执行时间,例如QVERIFY2().我怎样才能做到这一点?
编辑:
我目前正在做的是:
void UnitTest::benchmark()
{
QString str1 = QLatin1String("This is a test string");
QString str2 = QLatin1String("This is a test string");
QCOMPARE(str1.localeAwareCompare(str2), 0);
QBENCHMARK {
str1.localeAwareCompare(str2);
}
}
Run Code Online (Sandbox Code Playgroud) 我写了一个执行工作对象的线程。一切正常。结果信号也按应有的方式发出。当然,我处理了有关线程/对象关联性的常见错误。
今天我为这些工作线程/线程编写了一个自动化模块测试。我创建了一个 QSignalSpy 来等待工作对象(已移动到线程)发出的信号,如下所示:
QSignalSpy spy(worker, SIGNAL(Success()));
thread.ExecuteWorker();
QVERIFY(spy.wait()); // Error in this line
Run Code Online (Sandbox Code Playgroud)
我在标记行中收到一个众所周知的错误:
QObject::killTimer: timers cannot be stopped from another thread
Run Code Online (Sandbox Code Playgroud)
首先,我预计会出现错误,因为 wait() 中的某些代码在错误的线程中执行。然后我在QSignalSpy的实现中发现了如下代码:
if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, Qt::DirectConnection, 0))
{
qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect.");
return;
}
Run Code Online (Sandbox Code Playgroud)
这显然意味着 QSignalSpy 一直使用 DirectConnection 并且不能用于监视生活在不同线程中的对象的信号。
为什么他们在 Qt5.3 中这样编程?这是一个错误还是有意的行为?我该如何解决这个限制?
我使用 QTest 和 unittest 在 PyQt 中编写了一系列单元测试。我的代码传递信号,因此为了确保在测试之前操作后经过了足够的时间,我添加了一些 qWaits。
APP.ui.serverPortEdit.setText('1234')
QTest.mouseClick(APP.ui.userConnectButton, Qt.LeftButton)
QTest.qWait(2000) #wait for the server to connect
self.checkOnline()
Run Code Online (Sandbox Code Playgroud)
我想在 PySide 中运行相同的测试,但我找不到 qWait 的类似物。我是不是忽略了什么?PySide qTest 文档没有提及它。
我正在使用 QTest API 进行自动化。我使用带有用户名/密码的登录 API 进行身份验证,获取不记名令牌,并将该令牌用于下一个 API 调用。
但如果我在同一个 API 中使用 SSO 凭据(用户名/密码),则会出现错误
我想以编程方式使用 SSO 凭据或 SAML 响应来进行身份验证并获取访问令牌。有没有办法使用 SSO 凭证或 SAML 响应来使用 Postman 获取不记名令牌?
有任何技术文档可以帮助我吗?
Qtest 是否提供任何机制来使用 SSO 凭证以编程方式获取不记名令牌?
qtestlib ×10
qt ×7
c++ ×4
unit-testing ×2
macros ×1
mouseevent ×1
mousewheel ×1
pyqt ×1
pyside ×1
qsignalspy ×1
qt4 ×1
qt4.6 ×1
qt5 ×1
qtableview ×1
qtest ×1
qthread ×1
qttest ×1