Windows Mobile下使用CppUnitLite输出测试结果

背景

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

你可能感兴趣的:(Windows Mobile)