QTEST:带子对话框的测试对话框



我正在尝试为这样的用例创建测试:

  • 打开对话框
  • 单击此对话框中的按钮打开一个子对话框
  • 单击"子对话框"中的按钮
  • 关闭子对话框后,在对话框中采取了一些操作

我能够编写一项测试,该测试可以完成所有这些,并组织对话框以使这种测试成为可能。但是,存在一个奇怪的问题:如果这些步骤重复多次,则最终动作的重复次数超过应有的。为了简化,让我们假设动作正在输出输入数据。这是重复模式:

  • 使用数据" 1" ->输出是" 1"
  • 执行测试
  • 使用数据" 1 2" ->输出是" 1 2 2"
  • 执行测试
  • 使用数据" 1 2 3" ->输出是" 1 2 2 3 3 3"
  • 执行测试
  • 使用数据" 1 2 3 4" ->输出为" 1 2 2 3 3 3 4 4 4 4"

似乎重复了最终动作信号,但是我找不到代码出了问题。这是一个简化的代码示例,可复制该问题:

测试用例

void QtBugIsolationTest::testCase1()
{
  auto dialog = new MyDialog();
  QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton);
  QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton);
  QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton);
  QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton);
  QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton);
  QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton);
  QVERIFY(true);
}

主对话框

MyDialog::MyDialog()
{
  setGeometry(0, 0, 100, 100);
  subDialog = new MySubDialog(this);
  showSubDialogButton = new QPushButton(this);
  connect(showSubDialogButton, SIGNAL(clicked()), this, SLOT(OnShowSub()));
}
MyDialog::~MyDialog()
{
  delete showSubDialogButton;
}
void MyDialog::OnShowSub()
{
  connect(subDialog, SIGNAL(accepted()), this, SLOT(OnCloseSub()));
  subDialog->show();
}
void MyDialog::OnCloseSub()
{
  std::cout << "Closed sub dialog" << std::endl;
  subDialog->hide();
  disconnect(subDialog);//, SIGNAL(accepted()));
}

sub Dialog

MySubDialog::MySubDialog(QWidget* parent) : QDialog(parent)
{
  setGeometry(0, 0, 100, 100);
  button = new QPushButton(this);
  connect(button, SIGNAL(clicked()), this, SLOT(OnPush()));
  auto layout = new QHBoxLayout();
  layout->addWidget(button);
  setLayout(layout);
}
MySubDialog::~MySubDialog()
{
  delete button;
}
void MySubDialog::OnPush()
{
  std::cout << "Button Pushed" << std::endl;
  accepted();
}

如果要求(在Stackoverflow中进行),我可以为这些类的整个QTCreator项目或标题文件发布。

我终于发现了这个问题。正是通过disconnect()陈述不起作用。从

更改它
disconnect(subDialog);

to

subDialog->disconnect();

解决了问题。

最新更新