使用VS2012内建的C++测试架构进行单元测试

前言
在软件开发的过程中,单元测试(Unit testing)是一个重要的coding步骤,可以让你的程序代码质量大幅提升、协助你进行良好的程序架构设计,单元测试是针对程序单元(软件设计的最小单位)来进行正确性检验的测试工作,在程序化编程中,一个单元就是单个程序、函式、过程等;对于对象导向编程,最小单元就是方法,包括基础类别(超类)、抽象类、或者衍生类别(子类别)中的方法。

想要在VC++项目中,进行单元测试的Framework有很多选择,例如: CPPUnit、Google GTest...等,自Visual Studio 2012开始,提供了内建的单元测试框架Microsoft.VisualStudio.TestTools.CppUnitTestFramework并且与VS高度整合。

 

建立Production Code项目
Step 1. 建立Production Code
首先,建立一个基本的Win32主控台应用程序项目:

 

使用VS2012内建的C++测试架构进行单元测试_第1张图片
 

在此以一个简单的计算器为范例,请新增Calculator.h与Calculator.cpp,并撰写以下程序代码:

Calculator.h

 

view source print ?
01. #ifndef _CALCULATOR_H_
02. #define _CALCULATOR_H_
03.  
04. namespace CalculatorProject
05. {
06. class Calculator
07. {
08. public:
09. int add(int x, int y);
10. int minus(int x, int y);
11. int multiply(int x, int y);
12. int divide(int x, int y);
13. };
14. }
15.  
16. #endif /* _CALCULATOR_H_ */

Calculator.cpp

 

view source print ?
01. #include "Calculator.h"
02. using namespace CalculatorProject;
03.  
04. int Calculator::add(int x, int y)
05. {
06. return x+y;
07. }
08.  
09. int Calculator::minus(int x, int y)
10. {
11. return x-y;
12. }
13.  
14. int Calculator::multiply(int x, int y)
15. {
16. return x*y;
17. }
18.  
19. int Calculator::divide(int x, int y)
20. {
21. return x/y;
22. }

撰写完成后,项目应该如下图所示:

 

使用VS2012内建的C++测试架构进行单元测试_第2张图片
 

Step 2. 设定Production Code组态
请在方案总管中,对CalculatorProject按右键,于项目属性窗口中[组态属性]->[一般]->[项目默认值]->[组态属性]设定成"静态链接库 (.lib)"

 

使用VS2012内建的C++测试架构进行单元测试_第3张图片
 

建立测试项目
Step 3. 建立测试项目
请在同一方案中,新增测试项目:

 

使用VS2012内建的C++测试架构进行单元测试_第4张图片
 

Step 4. 设定测试项目组态
请在方案总管中,对CalculatorProjectUnitTest按右键,于项目属性窗口中进行以下设定:

1. 在[VC++目录]->[Include目录]设定参考Production Code的标头档

 

使用VS2012内建的C++测试架构进行单元测试_第5张图片
 

2. 在[VC++目录]->[链接库目录]设定参考Production Code预设的lib输出位置

 

使用VS2012内建的C++测试架构进行单元测试_第6张图片
 

3. 在[连结器]->[输入]设定连结Production Code输出的lib

 

使用VS2012内建的C++测试架构进行单元测试_第7张图片
 

Step 5. 撰写测试程序代码
可以先将测试项目预设的"unittest1.cpp"更名为"CalculatorTest.cpp",建议命名规则如下:
TEST_CLASS命名原则: ClassName + "Test",其中ClassName 为对应测试Production Code里头的类别名称
TEST_METHOD命名原则: "test" + MethodName,其中MethodName为对应测试Production Code里头的方法名称

以下为几点注意事项:

1. 记得引入欲测试的类别之标头档,如: 引入#include "Calculator.h"

2. TEST_METHOD_INITIALIZE(setUp) 、TEST_METHOD_CLEANUP(tearDown) 为执行每一个TEST_CASE前、后会执行的Code

3. 可以使用Logger::WriteMessage("")来记录测试中需要输出的信息

CalculatorTest.cpp

 

view source print ?
01. #include "stdafx.h"
02. #include "CppUnitTest.h"
03. #include "Calculator.h"
04. #include
05. using namespace std;
06. using namespace Microsoft::VisualStudio::CppUnitTestFramework;
07.  
08. namespace CalculatorProject
09. {
10. TEST_CLASS(CalculatorTest)
11. {
12. private:
13. Calculator *calculator;
14. public:
15. TEST_METHOD_INITIALIZE(setUp)
16. {
17. // method initialization code
18. Logger::WriteMessage("CalculatorTest setUp()\n");
19. calculator = new Calculator();
20. }
21.  
22. TEST_METHOD_CLEANUP(tearDown)
23. {
24. // test method cleanup  code
25. Logger::WriteMessage("CalculatorTest tearDown()\n");
26. delete calculator;
27. }
28.  
29. TEST_METHOD(testAdd)
30. {
31. Assert::AreEqual(9, calculator->add(6,3));
32. Logger::WriteMessage("testAdd() finish testing!\n");
33. }
34.  
35. TEST_METHOD(testMinus)
36. {
37. Assert::AreEqual(3, calculator->minus(6,3));
38. Logger::WriteMessage("testMinus() finish testing!\n");
39. }
40.  
41. TEST_METHOD(testMultiply)
42. {
43. Assert::AreEqual(18, calculator->multiply(6,3));
44. Logger::WriteMessage("testMultiply() finish testing!\n");
45. }
46.  
47. TEST_METHOD(testDivide)
48. {
49. Assert::AreEqual(2, calculator->divide(6,3));
50. Logger::WriteMessage("testDivide() finish testing!\n");
51. }
52. };
53. }

使用VS2012内建的C++测试架构进行单元测试_第8张图片
 

Step 6. 开启测试总管进行测试
撰写完成测试程序代码并且建置完成后,在工具列的[测试]->[窗口]->[测试总管]叫出测试总管画面,可以看到我们刚刚撰写的测试范例正等待我们去执行:

 

使用VS2012内建的C++测试架构进行单元测试_第9张图片
 

按下黄框处的[全部执行]即可开始执行单元测试啦!

执行完测试后,我们选取该测试单元,在下方会出现[输出]的按钮,可以叫出测试时使用Logger纪录的信息欧~

 

使用VS2012内建的C++测试架构进行单元测试_第10张图片
 

有可以针对测试结果进行Code Coverge分析:

 

使用VS2012内建的C++测试架构进行单元测试_第11张图片
 

结论
相信透过上面这个简单的小范例,读者应该可以建立出属于自己的Testing项目,VS 2012提供的测试项目与测试窗口,让我们可以更方便的进行测试工作,让我们一起建构强健、好用的应用程序吧!! ^_^

你可能感兴趣的:(使用VS2012内建的C++测试架构进行单元测试)