• <menu id="w2i4a"></menu>
  • logo Visual Studio系列教程

    文檔首頁>>Visual Studio系列教程>>Visual Studio 使用教程:如何編寫C ++ DLL的單元測試(下)

    Visual Studio 使用教程:如何編寫C ++ DLL的單元測試(下)


    Visual Studio是功能完備的 IDE,可用于編碼、調(diào)試、測試和部署到任何平臺,Visual Studio使用 .NET 開發(fā) iOS、Android 和 Web 應(yīng)用和游戲。

    點(diǎn)擊立即下載Visual Studio


    本演練介紹如何使用測試優(yōu)先方法開發(fā)本機(jī)C ++ DLL。本教程內(nèi)容比較多,分為兩部分進(jìn)行,此為下部分(點(diǎn)擊此處到底上部分內(nèi)容)。

    反復(fù)擴(kuò)大測試并使它們通過

    • 添加一個新測試:

    TEST_METHOD(RangeTest)
    {
      CRootFinder rooter;
      for (double v = 1e-6; v < 1e6; v = v * 3.2) { double actual = rooter.SquareRoot(v*v); Assert::AreEqual(v, actual, v/1000); } }
    注意:建議您不要更改已通過的測試。而是添加一個新測試,更新代碼以使該測試通過,然后添加另一個測試,依此類推。
    當(dāng)用戶更改要求時,請禁用不再正確的測試。編寫新的測試,并使它們一次以相同的增量方式工作。
    • 生成解決方案,然后在“測試資源管理器”中,選擇“全部運(yùn)行”。新測試失敗。

    The RangeTest fails

    提示:編寫每個測試后,請驗(yàn)證每個測試均立即失敗。這可以幫助您避免編寫永遠(yuǎn)不會失敗的測試的簡單錯誤。

    增強(qiáng)您的DLL代碼,以便新測試通過:

    #include 
    ...
    double CRootFinder::SquareRoot(double v)
    {
      double result = v;
      double diff = v;
      while (diff > result/1000)
      {
        double oldResult = result;
        result = result - (result*result - v)/(2*result);
        diff = abs (oldResult - result);
      }
      return result;
    }
    • 生成解決方案,然后在“測試資源管理器”中,選擇“全部運(yùn)行”。兩項(xiàng)測試均通過。

    Unit Test Explorer - Range Test passed

    提示:通過一次添加一個測試來開發(fā)代碼。 確保每次迭代后所有測試均通過。

    調(diào)試失敗的測試

    • 添加另一個測試:

    #include...
    // Verify that negative inputs throw an exception.
    TEST_METHOD(NegativeRangeTest)
    {
      wchar_t message[200];
      CRootFinder rooter;
      for (double v = -0.1; v > -3.0; v = v - 0.5)
      {
        try
        {
          // Should raise an exception:
          double result = rooter.SquareRoot(v);
    
          _swprintf(message, L"No exception for input %g", v);
          Assert::Fail(message, LINE_INFO());
        }
        catch (std::out_of_range ex)
        {
          continue; // Correct exception.
        }
        catch (...)
        {
          _swprintf(message, L"Incorrect exception for %g", v);
          Assert::Fail(message, LINE_INFO());
        }
      }
    }
    • 生成解決方案并選擇Run All,打開(或雙擊)失敗的測試,失敗的語句將突出顯示。故障消息在“測試資源管理器”的詳細(xì)信息窗格中可見。

    NegativeRangeTests failed

    • 要查看測試失敗的原因,請逐步執(zhí)行以下功能:
      • 在SquareRoot函數(shù)的開始處設(shè)置一個斷點(diǎn)。
      • 在失敗的測試的快捷菜單上,選擇“調(diào)試選定的測試”。

    • 當(dāng)運(yùn)行在斷點(diǎn)處停止時,逐步執(zhí)行代碼。
    • 在要開發(fā)的函數(shù)中插入代碼:
    #include...
    double CRootFinder::SquareRoot(double v)
    {
        // Validate parameter:
        if (v < 0.0) { throw std::out_of_range("Can't do square roots of negatives"); }

    現(xiàn)在所有測試都通過了。

    All tests pass

    提示:如果單個測試沒有依賴項(xiàng),從而不能以任何順序運(yùn)行它們,請在工具欄的設(shè)置菜單中打開并行測試執(zhí)行。這樣可以顯著減少運(yùn)行所有測試所需的時間。

    重構(gòu)代碼而不更改測試

    • 簡化平方根函數(shù)中的中央計算:

    // old code:
    //   result = result - (result*result - v)/(2*result);
    // new code:
         result = (result + v/result)/2.0;
    • 生成解決方案并選擇“全部運(yùn)行”,以確保您沒有引入錯誤。

    提示:一組好的單元測試使您確信更改代碼時沒有引入錯誤。保持重構(gòu)與其他更改分開。

    下一步

    • 隔離。大多數(shù)DLL依賴于其他子系統(tǒng),例如數(shù)據(jù)庫和其他DLL,這些其他組件通常是并行開發(fā)的。為了允許在其他組件尚不可用時執(zhí)行單元測試,您必須替換模擬。
    • 建立驗(yàn)證測試。您可以按設(shè)置的時間間隔在團(tuán)隊的構(gòu)建服務(wù)器上執(zhí)行測試。這樣可以確保在整合多個團(tuán)隊成員的工作時不會引入錯誤。
    • 簽入測試。您可以要求在每個團(tuán)隊成員將代碼檢入源代碼管理之前執(zhí)行一些測試。通常,這是一組完整的構(gòu)建驗(yàn)證測試的子集。
    • 您還可以要求最低級別的代碼覆蓋率。

    本文內(nèi)容到這里就結(jié)束了,點(diǎn)擊此處可以查看上部分內(nèi)容。


    想要購買Visual Studio正版授權(quán),或了解更多產(chǎn)品信息請點(diǎn)擊【咨詢在線客服】

    慧聚IT


    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();