C++ 更好的单元测试方法,耗时太长

C++ 更好的单元测试方法,耗时太长,c++,googletest,googlemock,C++,Googletest,Googlemock,我有一大堆测试,快100了。它们不再是单元测试,实际上它们更像是集成测试。 我想知道是否有更好的方法来测试我的代码。 我已经包括了我正在执行的测试的样本。 我需要添加1秒的等待,因为我正在使用线程 每次构建100秒似乎太多了,我添加的测试越多,情况只会变得更糟 TEST_F(UserInterfaceTest, DownloadConfiguration) { downloadconfigurationcommand = commands.DownloadConfiguration(20);

我有一大堆测试,快100了。它们不再是单元测试,实际上它们更像是集成测试。 我想知道是否有更好的方法来测试我的代码。 我已经包括了我正在执行的测试的样本。 我需要添加1秒的等待,因为我正在使用线程

每次构建100秒似乎太多了,我添加的测试越多,情况只会变得更糟

TEST_F(UserInterfaceTest, DownloadConfiguration)
{
downloadconfigurationcommand = commands.DownloadConfiguration(20);
    downloadconfigurationresponse = Response::GetDownloadConfigurationResponse();

    EXPECT_CALL(*m_View, SetNoteBookSelection(Display::SurveyPanel));
    EXPECT_CALL(*m_View, SaveFilePathDialog()).WillOnce(Return(wxID_OK));

    std::string val("C:\\Temp\\version20.bin");
    EXPECT_CALL(*m_View, GetSavePath()).WillOnce(Return(val));

    EXPECT_CALL(*m_Param, SetFunction(DOWNLOAD_CONFIGURATION));
    EXPECT_CALL(*m_Param, SetPathName(_));
    EXPECT_CALL(*m_Param, SetSurveyTimes(_));
    EXPECT_CALL(*m_Param, SetSurveyDelay(_));

    EXPECT_CALL(*m_Param, GetFunction()).WillOnce(Return(DOWNLOAD_CONFIGURATION));
    EXPECT_CALL(*m_Param, GetPathName()).WillOnce(Return(val));
    EXPECT_CALL(*m_Param, GetSurveyTimes()).WillOnce(Return(1));
    EXPECT_CALL(*m_Param, GetSurveyDelay()).WillOnce(Return(20));

    EXPECT_CALL(*m_View, CheckInstance(_, _));
    EXPECT_CALL(*m_View, GetSerialPortInstance()).WillRepeatedly(ReturnRef(serialport));
    EXPECT_CALL(*m_View, GetSerialPortAddress()).WillOnce(Return(port));

    EXPECT_CALL(*m_View, CustomEventDisplayData(_)).Times(AtLeast(1));

    EXPECT_CALL(serialport, Read(_))
        .WillOnce(DoAll(SetArgReferee<0>(downloadconfigurationresponse), Return(0)));

    EXPECT_CALL(serialport, Write(_))
        .WillOnce(DoAll(SetArgReferee<0>(downloadconfigurationcommand), Return(0)));

    EXPECT_EQ(wxTHREAD_NO_ERROR, m_Controller->DownloadConfiguration());

    Sleep(1000);
}

任何时候,当你在测试中添加睡眠时,你实际上是在等待其他事情发生,但不是与之同步。用怀疑的眼光看你考试中的任何睡眠

试着编写代码,以便可以独立于线程测试功能。如果您不能做到这一点,那么让测试在最后加入线程(这样您就知道您的测试破坏实际上破坏了整个测试)


请注意,如果您的计算机负载更高,您的测试当前将随机失败-这本身就表明您的测试不稳定。

任何时候您向测试添加睡眠时,您实际上在等待其他事情发生,但没有与它同步。用怀疑的眼光看你考试中的任何睡眠

试着编写代码,以便可以独立于线程测试功能。如果您不能做到这一点,那么让测试在最后加入线程(这样您就知道您的测试破坏实际上破坏了整个测试)


请注意,如果您的计算机负载更高,您的测试当前将随机失败-这表明您的测试不稳定。

“我需要添加1秒的等待,因为我正在使用线程”-这听起来不正确。我认为这也不正确,因此提出了问题。我需要等待代码工作,如果我不这样做,单元测试将继续进行到下一个单元测试,程序崩溃,因为所有变量都已释放。你可以使用std::mutex进行同步,而不是等待任意时间。我会模拟你在代码中创建的线程,并使用模拟线程调用模拟运行方法。
CCThread*t
可能会泄漏(当
err=t->run();
返回
wxTHREAD\u NO\u ERROR
)。指针似乎不需要。“我需要添加1秒的等待,因为我正在使用线程”-这听起来不正确。我认为这也不正确,因此提出了这个问题。我需要等待代码工作,如果我不这样做,单元测试将继续进行到下一个单元测试,程序崩溃,因为所有变量都已释放。你可以使用std::mutex进行同步,而不是等待任意时间。我会模拟你在代码中创建的线程,并使用模拟线程调用模拟运行方法。
CCThread*t
可能会泄漏(当
err=t->run();
返回
wxTHREAD\u NO\u ERROR
)。指针似乎不需要了。我试图使线程可连接,并取消了休眠。我对这段代码有问题,因为线程试图发布一个事件,但是测试已经开始了。如果(m_Function==download_config){DownloadConfig(m_PathName);//此时它会崩溃。CloseConnection(std::string(“closing comports\n”);返回0;}我如何通知测试等待线程完成?由于等待时间减少了4倍,我现在可以让它同步了。我向控制器添加了一个信号量,并将其传递给线程构造函数,并在测试结束时调用信号量wait。我对这段代码有问题,因为线程试图发布一个事件,但是测试已经开始了。如果(m_Function==download_config){DownloadConfig(m_PathName);//此时它会崩溃。CloseConnection(std::string(“closing comports\n”);返回0;}我如何通知测试等待线程完成?由于等待时间减少了4倍,我现在可以让它同步了。我向控制器添加了一个信号量,并将其传递给线程构造函数,并在测试结束时调用信号量wait。
wxThreadError wxframecontroller::DownloadConfiguration()
{
    wxThreadError err = wxTHREAD_MISC_ERROR;

    m_View->SetNoteBookSelection(Display::SurveyPanel);

    int dialog = m_View->SaveFilePathDialog();

    if (dialog == wxID_OK)
    {
        m_Param->SetFunction(DOWNLOAD_CONFIGURATION);
        m_Param->SetPathName(m_View->GetSavePath());
        m_Param->SetSurveyTimes(1);
        m_Param->SetSurveyDelay(sec_10);

        m_View->CheckInstance(m_View->GetSerialPortInstance(), m_View->GetSerialPortAddress());
        {
            CCThread* t = new CCThread(m_View, m_View->GetSerialPortInstance(), m_Param);
            err = t->Create();

            if (err != wxTHREAD_NO_ERROR)
            {
                wxMessageBox(_("Couldn't create thread!"));
                delete t;
                t = NULL;
            }
            else
            {
                err = t->Run();
            }

            if (err != wxTHREAD_NO_ERROR)
            {
                wxMessageBox(_("Couldn't run thread!"));
                delete t;
                t = NULL;
            }
        }
    }
    return err;
}