Skip to Content

自己寫一個 GUI 版 C++ Builder 單元測試

最近在寫一個較大的專案,而且要能在 Windows 和 Mac 上執行(Android 和 iOS 以後再考慮),加上第一次用新版 C++ Builder 跨平台的版本寫大專案,所以凡事起頭難,這也是第一次想加上單元測試,以利後續檢查與驗證。

C++ Builder 上面宣稱已有跨平台版本的 DUnitX,詳見如下:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/DUnitX

主要方法是在 __published 的宣告範圍內寫下要測試的程式,然後自行把每一個測試程式寫進去,執行時就會逐一執行測試程式,最後把結果列出來,如下圖。

基本上測試還 OK,原本遇到一個小問題,就是說明文檔中有提到,需要宣告或初值設定的物件,可以寫在 SetUp() 這個函式中。

但我在實際測試時,發現 SetUp() 函式並不會被執行到,網路上也看到有人問這個問題,沒有找到答案。

這本來是小事,大不了我在測試函式中,自行呼叫 SetUp() 就可以解決了。後來遇到一個更大的問題,我要在 Mac OS 中測試時,發現沒有正確的結果跑出來,只有如下的結果,畫面是執行二次的情況。

這樣問題就很大了,網路上也沒找到什麼資料,只看到有人建議不要用 DUNITX,用 DUNIT 比較好。可是我就是要跨平台,所以一定要用 DUNITX 才行。

另一個問題,原本我也想使用 GUI 的版本,上面提到官方的文檔的最下面,也有提到 GUI 版本的設定法,其他地方的說明文件也略有提到,但我之前試不出來,就放棄了,反正純文字版一樣可以達到目的。

現在最嚴重的問題是 Mac OS 不能執行,也不知問題是系統或是我自己不會弄?我用系統產生最原始最簡單的範例也一樣不行,所以打算自己寫一個簡單陽春堪用的 GUI 單元測試。

程式在此:

https://github.com/heavenchou/Cpp_Sample_BCB/tree/master/GuiUnitTest

簡單說一下原理:

主要程式有二支,一支主程式,一支待測物件類別,待測物件可以自己加上去。

待測物件初始要準備二個 TStringList 的指標,分別用來記錄說明文字和結果。通常這裡也是要載入你真正要測試的物件。

__fastcall CSample::CSample(TStringList * slTitle, TStringList * slResult)
{
  Titles = slTitle;
  Results = slResult;
}

然後要有一個 RunAllTest() 裡面就放所有要測試的函式及說明文字。

void __fastcall CSample::RunAllTest()
{
  LogTest(u"測試:傳回正確", Test1());
  LogTest(u"測試:傳回錯誤", Test2());
}

這是將結果記錄下來,結果為 ture 的記錄 "1", false 記錄 "0"。

void __fastcall CSample::LogTest(String sTitle, bool bResult)
{
  String s = "0";
  if(bResult) s = "1";
  Titles->Add(sTitle);
  Results->Add(s);
}

測試程式自己寫,這裡懶的寫,直接傳回。

bool __fastcall CSample::Test1()
{
  return true;
}

 


 

主程式就是先宣告 TStringList,宣告待測物件,然後執行它的 RunAllTest()

__fastcall TfmMain::TfmMain(TComponent* Owner)
: TForm(Owner)
{
  // 儲存結果的字串列表
  Titles = new TStringList();
  Results = new TStringList();
  // 測試物件
  Sample = new CSample(Titles, Results);
  Sample->RunAllTest();
}

這就是按下按鈕後,把結果秀在主畫面上的程式

void __fastcall TfmMain::btRunAllTestClick(TObject *Sender)
{
  for (int i = 0; i < Titles->Count; i++)
  {
    lbResult->Items->Add(Titles->Strings[i]);
    if(Results->Strings[i] == "1")
    {
      // 測試正確則打勾
      lbResult->ListItems[i]->IsChecked = true;
    }
    else
    {
      // 失敗則塗紅色
      lbResult->ListItems[i]->StyledSettings = lbResult->ListItems[i]->StyledSettings >> TStyledSetting::FontColor;
      lbResult->ListItems[i]->TextSettings->FontColor = 0xffff0000;
    }
  }
}

以上我有忽略 TListBox 的標題處理程式,原始程式中是有的。

底下就是執行結果,除了上面的基本測試,我也加了實際測試的四個項目,看起來就是比純文字結果舒服多了。 :)

重點是在 Mac OS 也能執行,而且更好看呢。

未來如果需要,可以再想辦法加上 GUI 物件的測試,可測試 GUI 物件操作及效果,這就是純文字版做不到的了。

 

回應

發表新回應

這個欄位的內容會保密,不會公開顯示。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。
  • 可使用的 HTML 標籤:<a> <address> <b> <blockquote> <br> <caption> <center> <cite> <code> <dd> <del> <div> <dl> <dt> <em> <h1> <h2> <h3> <h4> <h5> <h6> <hr> <i> <img> <ins> <li> <ol> <p> <pre> <span> <strike> <strong> <sub> <sup> <table> <tbody> <td> <th> <tr> <u> <ul>
    Allowed Style properties: background, background-attachment, background-color, background-image, background-position, background-repeat, border, border-bottom, border-bottom-color, border-bottom-style, border-bottom-width, border-collapse, border-color, border-left, border-left-color, border-left-style, border-left-width, border-right, border-right-color, border-right-style, border-right-width, border-spacing, border-style, border-top, border-top-color, border-top-style, border-top-width, border-width, bottom, caption-side, clip, color, direction, empty-cells, font, font-family, font-size, font-size-adjust, font-stretch, font-style, font-variant, font-weight, height, left, letter-spacing, line-height, list-style, list-style-image, list-style-position, list-style-type, margin, margin-bottom, margin-left, margin-right, margin-top, max-height, max-width, min-height, min-width, overflow, padding, padding-bottom, padding-left, padding-right, padding-top, right, table-layout, text-align, text-decoration, text-indent, text-transform, top, unicode-bidi, vertical-align, white-space, width, word-spacing, z-index

更多關於格式選項的資訊

CAPTCHA
驗證碼只有阿拉伯數字, 這是躲廣告用的, 麻煩你輸入了.
Image CAPTCHA
Enter the characters shown in the image.


story | about seo