更好的单元测试方法,需要太长时间

Better way to unit test, taking too long

我有一堆测试接近 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);
}

这就是控制器的作用。

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;
}

任何时候你在测试中添加睡眠,你实际上是在等待其他事情发生,而不是与之同步。以极大的怀疑看待测试中的任何睡眠。

尝试编写您的代码,以便您可以独立于线程测试功能。如果你不能这样做,让测试在最后加入线程(这样你就知道你的测试拆除实际上拆除了整个测试)。

请注意,如果您的计算机负载更高,您的测试目前会随机失败 - 仅此一项就表明您的测试不稳定。