Windows Mobile下使用CppUnitLite輸出測試結果

來源:互聯網
上載者:User
背景

TDD測試驅動開發是當前流行的開發方法及模式。遵循TDD的方法對開發程式庫(Library)特別有用,因為Library就是為第三方提供一定功能介面的實現,使用TDD的方法可以預先為定義的介面提供測試案例,保證實現代碼能通過測試,保證Library能如實的實現預定義的功能。我之前開發的Mobile Sensors API的庫,由於沒有編寫單元測試,得到了一些不好的反饋,現在把單元測試引進到該庫裡面,提高該庫的品質。關於該Mobile Sensors API庫的開發可以參考 Windows Mobile下的重力感應器(Gravitational Sensor)開發。關於wince和Windows mobile下的native C++的測試可以參考 Wince和Windows Mobile下native C++的單元測試。關於CF平台下的測試可以參考 .NET Compact Framework下的單元測試。 使用TDD的一個執行個體可以參考 Windows Mobile下猜數字遊戲的TDD實現。

簡介

本文講述Windows Mobile下使用CppUnitLite對native c++進行unit test的時候,如何把測試結果輸出到檔案的開發。使之支援Mobile Sensors API庫。

實現

由於原版的CppUnitLite只是支援把測試結果列印到標準輸出裡面,但是Windows Mobile預設是沒有console輸出的,所以要對CppUnitLite進行修改使之支援把結果輸入到檔案裡。

修改定義
#include <stdio.h>

class Failure;

class TestResult
{
public:
TestResult (char* _fileName = 0);
virtual void testsStarted ();
virtual void addFailure (const Failure& failure);
virtual void testsEnded ();

private:
int failureCount;
char* fileName;
FILE* fileStream;
};

這個功能的實現需要修改TestResult類,首先增加fileName變數保持輸出檔案路徑和名字,增加fileStream儲存檔案流的控制代碼。然後修改TestResult的建構函式,原建構函式是沒有輸入參數的,如TestResult ();修改為增加檔案路徑和名字輸入參數。 TestResult (char* _fileName = 0);為了保持原先client代碼的源碼級相容,這個參數有預設值為0(空,NULL)。這裡說的client源碼級的相容是指client的代碼不需要進行任何的修改就可以支援修改後的新庫,這符合軟體設計過程的Open-Close Principle。但是這修改不支援運行時相容,client需要重新編譯(因為標頭檔修改了)和連結(因為CppUnitLite靜態庫更新了)。

更新實現
TestResult::TestResult (char* _fileName)
: failureCount (0),
fileName(_fileName)
{
}

修改建構函式,把輸入儲存到成員變數中。

void TestResult::testsStarted () 
{
if(fileName != NULL)
{
fileStream = fopen(fileName, "w");
}
else
{
fileStream = stdout;
}
}

修改啟動測試函數,當檔案名稱不為空白的時候,產生輸出檔案流(stream)。如果為空白時,使用標準輸出資料流。

void TestResult::addFailure (const Failure& failure) 
{
fprintf (fileStream, "%s%s%s%s%ld%s%s\n",
"Failure: \"",
failure.message.asCharString (),
"\" " ,
"line ",
failure.lineNumber,
" in ",
failure.fileName.asCharString ());

failureCount++;
}

把錯誤資訊輸出到輸出資料流中。

void TestResult::testsEnded () 
{
if (failureCount > 0)
fprintf (fileStream, "There were %ld failures\n", failureCount);
else
fprintf (fileStream, "There were no test failures\n");

if(fileName != NULL && fileStream != NULL)
{
fflush(fileStream);
fclose(fileStream);
fileStream = NULL;
}
}

清理資源,在Wince和Windows Mobile下,有時候需要顯式(explicit)的調用fflush,否則有些輸出不能同步到檔案中去。

Client的修改
//Unit Test
TestResult tr("TestResult.txt");
TestRegistry::runAllTests(tr);

修改client的代碼很簡單,只需要在產生TestResult 的對象是傳遞檔案名稱就可以了,如果不傳遞絕對路徑,檔案會產生到根目錄下。

關於Mobile Sensors API項目

這個項目還是在起步階段,當前實現了samsung的重力感應器,我把項目host到 Mobile Sensors API - Native unified APIs for Windows Mobile Sensors 了,我會持續改進,把各種sensors的實現到這個項目中。

由於我手頭上沒有HTC的機器,如果誰有興趣可以加入到項目中幫我測試HTC裝置,由於加入了Unit Test,測試變得很簡單,只需要執行程式,參考測試輸出檔案就可以了,不需要調試。當然這個測試過程是一個不斷迭代的過程,只是Unit Test把子過程簡單化了。

原始碼:http://mobilesensor.codeplex.com/SourceControl/ListDownloadableCommits.aspx

環境:VS2008 + WM 6 professional SDK + Samsung Windows Mobile SDK

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.