你能比较C++的热门单元测试框架和Qt的QTest吗?
(cppunit,加强测试,谷歌测试等..)
缺点有哪些优点?谢谢.
注意:GUI测试对我们来说不是很重要.
我正在使用QT Creator并希望在单独的项目中运行我的单元测试.如何从我的测试项目中引用主项目中的类?
我对Qt非常陌生,我需要使用QTest命名空间和来模拟点击QTest::mouseClick。我的问题是我想单击QMenu定义为的条目,QAction但是该mouseClick函数不允许我将其作为参数传递(仅QWidgets或QWindows)。
我在这里可以做什么?
我有一个使用PyQt-5.5.1的工作脚本,我现在想要移植到一个新的PyQt版本(5.7).适应大多数事情很好,但我面临两个主要问题:(1)执行(模拟)鼠标点击,(2)访问(假设:打印)当前显示的网页的html源代码分别是QWebView或QWebEngineView.
例如,我可以使用PyQt-5.5.1中的QWebView执行以下操作:
QTest.mouseClick(self.wvTest, Qt.LeftButton, QPoint(x, y))
Run Code Online (Sandbox Code Playgroud)
和
frame = self.wvTest.page().mainFrame()
print(frame.toHtml().encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
我知道有关移植到QWebEngineView但无法将C++表示法转换为可用的Python代码的文档以及此页面.
如何在PyQt-5.7中将其改编为QWebEngineView?下面是PyQt-5.5.1的一个完整工作片段,它对于新的PyQt版本失败了:
AttributeError: 'QWebEnginePage' object has no attribute 'mainFrame'当我删除大型机()时:TypeError: toHtml(self, Callable[..., None]): not enough arguments.import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtCore import QRect, Qt, QUrl, QPoint, QEvent from PyQt5.QtTest import QTest from PyQt5.Qt import PYQT_VERSION_STRRun Code Online (Sandbox Code Playgroud)if PYQT_VERSION_STR=='5.5.1': from PyQt5 import QtWebKitWidgets else: from PyQt5 import QtWebEngineWidgets
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.button1 = …
在Qt Creator中,当我创建一个新的Unit Test项目时,如果项目的完整路径包含空格,它将无法成功构建.
我已经将错误跟踪到qmake生成的makefile.makefile包含一条靠近顶部的行,如:
DEFINES = -DUNICODE -DWIN32 -DSRCDIR=\"C:/Users/Smith/Qt Projects/Unit_Tests/\" -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_TESTLIB_LIB -DQT_CORE_LIB -DQT_TESTCASE_BUILDDIR=\"C:/Users/Smith/Qt Projects/Debug_Unit_Tests\"
Run Code Online (Sandbox Code Playgroud)
SRCDIR和的值中的引号QT_TESTCASE_BUILDDIR用反斜杠转义.如果我从中删除反斜杠Makefile.Debug,那么项目将成功构建.
显然,我不希望每次都手动删除反斜杠.我还想避免一个删除反斜杠的自定义构建步骤.因为qmake有很多选项,所以我希望有一些东西可以放在.pro文件中来解决这个问题.
我试过类似的东西DEFINES -= QT_TESTCASE_BUILDDIR.然而,这不起作用,因为QT_TESTCASE_BUILDDIR尚未定义. testlib显然后来添加了自己的定义.
我在用:
什么是摆脱反斜杠最简单的方法?
编辑:这也发生在OSX上.
我正在使用 QTestLib 库和 QTest 来运行我的单元测试。我正在 Windows 7 上工作,并在 MVSC 2010 编译器中使用 Qt 4.8。当我使用以下方法运行测试时:
QTest::qExec(TestDateDD/whateverTestClass);
Run Code Online (Sandbox Code Playgroud)
我在控制台中得到输出:
********* Start testing of TestDateDD *********
Config: Using QTest library 4.8.0, Qt 4.8.0
PASS : TestDateDD::initTestCase()
PASS : TestDateDD::testValidity()
FAIL! : TestDateDD::testMonth(2012/7/10) Compared values are not the same
Actual (date.longMonthName(date.month())): July
Expected (monthname): June
..\UnitTestingPlugiin\TestDateDD.cpp(38) : failure location
PASS : TestDateDD::cleanupTestCase()
Totals: 3 passed, 1 failed, 0 skipped
********* Finished testing of TestDateDD *********
Run Code Online (Sandbox Code Playgroud)
但是,我的要求是在我的 GUI 中为每个测试槽显示此消息。我做了一些研究,发现qtestlog.cpp使用它自己的messageHandler来管理测试输出并将结果显示为 PASS 或 FAIL 以及失败消息、行号等。 …
我正在使用QTest在应用程序中创建一些自动化的GUI测试。
我可以使用以下命令从应用程序中访问小部件:
savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是现在我必须单击QMessageBox的“确定”按钮。
我在应用程序中创建了QMessageBox,如下所示:
if( something_wrong )
{
QMessageBox::warning(new Widget(), "Title", "Something wrong!");
}
Run Code Online (Sandbox Code Playgroud)
我如何访问此QMessageBox及其按钮?
我想测试一个Web服务器的异步请求.为此,我正在创建一个简单的单元测试来快速尝试几行代码:
void AsynchronousCall::testGet()
{
QNetworkAccessManager *nam = new QNetworkAccessManager(this);
QUrl url("http://myownhttpserver.org");
QNetworkRequest req(url);
this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
QNetworkReply *rep = nam->get(req);
}
void AsynchronousCall::reqFinished(QNetworkReply *rep)
{
qDebug() << rep->readAll();
qDebug() << "finshed";
}
Run Code Online (Sandbox Code Playgroud)
问题是永远不会达到reqFinished().如果我有一个简单的QEventLoop和一个loop.exec()就在nam-> get(req)之后; 请求被执行.
任何提示?我是否必须在每个单元测试中使用loop.exec()?
抱歉标题不好,我不知道如何标题这个问题.请编辑并使其更好.
我正在使用Qt测试框架编写测试,我正在尝试编写一些有用的输出供QVERIFY2()宏使用.所有以下语句都无法使用大致相同的错误消息进行编译:
QVERIFY2( spy.count() == 1, "Emitted signal pathChanged() was emitted " + spy.count() + " times instead of 1 time" );
QVERIFY2( spy.count() == 1, QString( "Emitted signal pathChanged() was emitted " ) + QString( spy.count() ) + QString( " times instead of 1 time" ) );
QVERIFY2( spy.count() == 1, "Emitted signal pathChanged() was emitted " + QString( spy.count() ) + " times instead of 1 time" );
Run Code Online (Sandbox Code Playgroud)
上次尝试的错误消息是:
PathTester.cxx: In member function ‘void PathTester::testReservePath()’:
PathTester.cxx:241:128: …Run Code Online (Sandbox Code Playgroud) 我如何使用foreach循环QSignalSpy?
这就是我想要做的:
foreach( const QList<QVariant> &args, mySignalSpy )
{
Q_ASSERT( args.count() == 2 );
QVariant arg0 = args[0];
QVariant arg1 = args[1];
doSomething( arg0, arg1 );
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
/usr/local/Trolltech/Qt-4.8.2-shared/include/QtTest/qsignalspy.h: In instantiation of ‘QForeachContainer<T>::QForeachContainer(const T&) [with T = QSignalSpy]’:
MyTester.cxx:843:64: required from here
/usr/local/Trolltech/Qt-4.8.2-shared/include/QtCore/qobject.h:333:5: error: ‘QObject::QObject(const QObject&)’ is private
Run Code Online (Sandbox Code Playgroud) 我尝试使用QTest命名空间的mouseClick函数单击QPushButton.QPushButton是Widget的私有成员.单击期间鼠标光标的位置位于按钮的中心,但是没有单击按钮...有人可以解释一下为什么?
MyWidget *myWidget= new myWidget();
myWidget->show();
while ( !myWidget->isVisible() ) {
QTest::qWait(200);
}
QTest::qWait(500);
QTest::mouseMove ( myWidget, QPoint( 70, 100 ), -1 );
QTest::mouseClick ( myWidget, Qt::LeftButton, Qt::NoModifier, QPoint( 70, 100 ), 100);
Run Code Online (Sandbox Code Playgroud)
谢谢
qtestlib ×12
qt ×9
unit-testing ×4
c++ ×3
qt-creator ×2
qt4 ×2
boost-test ×1
cppunit ×1
foreach ×1
googletest ×1
pyqt5 ×1
python ×1
qaction ×1
qmenu ×1
qmessagebox ×1
qtwebengine ×1
qtwebkit ×1
qwidget ×1