Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: nvek от Март 02, 2017, 11:44



Название: Тестирование UI компонентов (РЕШЕНО)
Отправлено: nvek от Март 02, 2017, 11:44
Вообщем как тестировать, если они в закрыты в приват?
сделать паблик?
Код:
//private:
Ui::ConnectedForm ui;
ведь не надо так делать?
есть идея просто тыкать вначале Два таба, чтобы курсор перешол на поле, дальше еще таб, еще интер.....
как вы делаете?


Название: Re: Тестирование UI компонентов
Отправлено: Пантер от Март 02, 2017, 11:49
Код
C++ (Qt)
#ifdef TEST
public:
#else
private:
#endif
 


Название: Re: Тестирование UI компонентов
Отправлено: nvek от Март 02, 2017, 12:04
почему то кажется, что так тоже делать нельзя


Название: Re: Тестирование UI компонентов
Отправлено: Пантер от Март 02, 2017, 12:13
Можно еще тест френдом делать. А можно методом Павлика Морозова:
Код
C++ (Qt)
#define private public
 


Название: Re: Тестирование UI компонентов
Отправлено: nvek от Март 02, 2017, 12:25
а можно поподробнее?
вот например тест, который заполняет комбобоксы и жмякает ентер.

Код:
void ConnectedFormTests::test_ConnectionFormConnect()
{
QFETCH(QString, id);
QFETCH(QString, hostName);
QFETCH(QString, expecded);

ConnectedForm* v = new ConnectedForm(NULL);
v->show();

QTest::keyClick(v, Qt::Key_Tab);
QTest::keyClick(v, Qt::Key_Tab);
QTest::keyClicks(v, id);
QTest::keyClick(v, Qt::Key_Tab);
QTest::keyClicks(v, hostName);


msgBoxProcessTimer.start();
QTest::keyClick(v, Qt::Key_Enter);

if(expecded != "")
QCOMPARE(msgBoxMessage, expecded);

delete v;
}
раньше были v->ui.combobox ,,,,,,
несложно заменить


Название: Re: Тестирование UI компонентов
Отправлено: nvek от Март 02, 2017, 12:33
class ConnectedForm; //дружественный класс

class ConnectedFormTests : public QObject
{
   Q_OBJECT
private slots:
///
public:
   friend ConnectedForm;

Код:
void ConnectedFormTests::test_ConnectionFormConnect()
{
QFETCH(QString, id);
QFETCH(QString, hostName);
QFETCH(QString, expecded);

ConnectedForm* v = new ConnectedForm(NULL);
v->show();


QTest::keyClicks(v->ui.comboBox, id);
//QTest::keyClick(v, Qt::Key_Tab);
QTest::keyClicks(v->ui.comboBox_2, hostName);


msgBoxProcessTimer.start();
QTest::keyClick(v->ui.btnConnect, Qt::LeftButton);

if(expecded != "")
QCOMPARE(msgBoxMessage, expecded);

delete v;
}
но почему то ругается


Название: Re: Тестирование UI компонентов
Отправлено: Пантер от Март 02, 2017, 12:41
ConnectedFormTests надо врендом делать.


Название: Re: Тестирование UI компонентов
Отправлено: nvek от Март 02, 2017, 12:42
я думаю, что можно как то к objectName обратиться


Название: Re: Тестирование UI компонентов
Отправлено: nvek от Март 02, 2017, 13:50
Допустим если это не ui компонент, и все создано без дизайнера, и все компоненты в привате.
как к ним обратиться чтобы тестировать?


Название: Re: Тестирование UI компонентов
Отправлено: Пантер от Март 02, 2017, 13:59
1. Как я уже выше написал - сделать пабликов для тестов.
2. Проставить всем objectName и искать через findChild у QWidget


Название: Re: Тестирование UI компонентов
Отправлено: vipet от Март 03, 2017, 00:48
Имхо, для тестов нужно посылать события кликов мыши и нажатия клавиш окну. Т.е. эмулировать то, что делает пользователь.

P.S. UI сделан в дизайнере или в С++ коде, private/public - это все неважно.


Название: Re: Тестирование UI компонентов
Отправлено: lit-uriy от Март 03, 2017, 06:25
nvek, в твоём примере ConnectedForm-у разрешается доступ к ConnectedFormTests-у, а не наоборот.
Т.е. если в неком классе А в качестве друга ты указал класс Б, это означает, что Б теперь имеет доступ к членам класса А.


Название: Re: Тестирование UI компонентов
Отправлено: nvek от Март 06, 2017, 10:23
уи в привате, все как надо.
вот как у меня получилось:
Код:
QFETCH(QString, id);
QFETCH(QString, hostName);
QFETCH(QString, expecded);

ConnectedForm* v = new ConnectedForm(NULL);
v->show();

QPushButton * btnConn = v->findChild<QPushButton*>(QStringLiteral("btnConnect"));
QComboBox* cmb1 = v->findChild<QComboBox*>(QStringLiteral("comboBox"));
QComboBox* cmb2 = v->findChild<QComboBox*>(QStringLiteral("comboBox_2"));

QTest::keyClicks(cmb1, id);
QTest::keyClicks(cmb2, hostName);
msgBoxProcessTimer.start();
btnConn->click();

if(expecded != "")
QCOMPARE(msgBoxMessage, expecded);

delete cmb1;
delete cmb2;
delete btnConn;
delete v;