gtest+svn+hudson 构建持续集成单元测试环境

gtest+svn+hudson 构建持续集成单元测试环境

 

作者:wulong710

看不到图的请来我博客 http://blog.csdn.net/wulong710/archive/2010/09/30/5916624.aspx

总结一下这两天搭建测试环境的心得。

1           任务:

项目组的版本管理工作是很麻烦的,每天催人提交代码,然后编译、测试。通不过打回给程序员,再重来。这种繁琐的工作可以交给电脑来做。我们以一个 MFC 项目为例。 Gtest   、 hudson   svn 这三个工具都很火,把这三个综合一下,就是一个很好的集成测试环境。

2           准备

2.1          E 盘清空

2.2          GoogleTest  地址 http://code.google.com/p/googletest/downloads/list/gtest-1.5.0.zip

2.3          SVN 软件包

2.3.1     SVN 服务器 VisualSVN-Server-2.1.3.msi

2.3.2     SVN 客户端 TortoiseSVN-1.6.10.19898-win32-svn-1.6.12.msi

2.4          Hudson 软件包

2.4.1     hudson.war

2.4.2     apache-maven-2.2.1-bin.zip

2.4.3     apache-tomcat-7.0.2-windows-x86.zip

2.4.4     JDK

3           安装软件包

3.1          编译解压 gtest 源码包,运行 gtest-1.5.0/ gtest-1.5.0/msvc/ gtest.sln 得到 gtestd.lib 库,这是单元测试用的。

3.2          安装 SVN 服务器 VisualSVN 与客户端 TortoiseSVN 。服务器的仓库设在 E:/svn_server/Repositories

3.3          安装 hudson

3.3.1     安装 JDK 环境

3.3.2     apache-maven-2.2.1-bin.zip 解压到 E:/apache-maven-2.2.1 ,在电脑环境变量中添加 MAVEN_HOME = E:/apache-maven-2.2.1

3.3.3     apache-tomcat-7.0.2-windows-x86.zip 解压到 E:/apache-tomcat-7.0.2 ,在环境变量中添加 TOMCAT_HOME = E:/apache-tomcat-7.0.2

3.3.4     hudson.wa r 直接拷贝到 E:/apache-tomcat-7.0.2/webapps 文件夹下,设置 hudson 工作目录 在环境变量中添加 Hudson_Home = E:/hudson_directory

图表 1

 

 

4           编写 MFC 测试用例

我的工作目录为 D:/mystudy/cpp_repository/test_mfc

4.1          建立对话框工程 test_ok

4.2          gtest-1.5.0 包中取出 include 头文件夹和 gtestd.lib 放到 D:/mystudy/cpp_repository/test_mfc/test_ok 文件夹中

图表 2

4.3          设置参数

4.3.1     设置调试模式 Debug —— > 配置管理器—— > 活动解决方案配置—— > 新建。在弹出对话框中“名称”设为 Debug_gtest ,“从此处设置”设为 Debug

图表 3

4.3.2     项目—— > 属性—— > 配置属性—— >c/c++ 常规—— > 附加包含目录,设置为相对路径 ../include 这是我们复制的 gtest 头文件路径。

图表 4

4.3.3     项目—— > 属性—— > 配置属性—— > 链接器—— > 输入—— > 附加依赖项,设置为相对路径 ../gtestd.lib

图表 5

4.3.4     项目—— > 属性—— > 配置属性—— > 常规—— > 项目默认—— >MFC 的使用,设置为“在静态库中使用 MFC ”。

图表 6

4.3.5     添加代码

4.3.5.1    添加头,我们这是简单例子,不另建文件,直接加到 test_ok.cpp 头部,注意是加到头部,加到 #ifdef _DEBUG 后面容易导致编译失败

#include  

#include  

#include

#include

图表 7

 

4.3.5.2    加控制台代码。用我们的控制台作为gtest的测试界面,替换掉 MFC 项目的对话框界面。

 

class   CConsole

{

public :

     CConsole(void );

     virtual ~CConsole(void );

private :

 

}; 

 

CConsole::CConsole(void )

{

     AllocConsole();

 

       int hCrun;    

     hCrun = _open_osfhandle((long )GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);

     FILE* hFile  = _fdopen(hCrun, "w" );

 

     // use default stream buffer

 

     setvbuf(hFile, NULL, _IONBF, 0);

 

     *stdout = *hFile;

     //test 

     //_cprintf("test console by _cprintf/n", 0);

     //std::cout << "test console by std::out/n";

}

 

 

 

CConsole::~CConsole(void )

{

     FreeConsole();

图表 8

4.3.5.3    BOOL Ctest_okApp::InitInstance() 中添加代码,屏蔽对话框代码

 

BOOL Ctest_okApp::InitInstance()

{

#if 1

       CConsole cc;

 

     int argc = 0;

 

     TCHAR* argv = _T("" );

 

     testing::GTEST_FLAG(output) = "xml:test_result.xml" ; // 加上这条则测试结果以xml 格式保存下来。保存路径可以修改,如"xml:d/" 表示保存到d:

                                                   // 如果用hudson 集成,建议直接设置成"xml:test_result.xml"

                                                   // 否则也许程序不会自动更新老版本test_result.xml

     testing::InitGoogleTest(&argc, &argv);

 

       RUN_ALL_TESTS();

 

     AfxMessageBox(_T("what ??????xxxx" ));

 

 

//     HWND hwnd = GetConsoleWindow();

 

//     SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);

 

//   std::string s;

 

     return FALSE;

#else

。。。。。。。。。。。。。

#endif

}

 

图表 9

4.3.5.4    主体代码完毕,现在添加测试用例

int   func_check (int   val = 0)

{

     return val;

}

 

TEST(larg_name, wrong_test)

{

     EXPECT_EQ( 110, func_check (15) );

}

 

TEST(larg_name, right_test)

{

     EXPECT_EQ( 20, func_check (20) );

}

 

图表 10

4.3.5.5    编译

图表 11

                            显示 test_ok.cpp 文件的 155 行测试用例有错,程序员希望返回 110 ,但是程序返回 15 ,不合测试用例。

4.4          改为批处理方式编译

编写批处理 go.bat 放到 test_ok.sln 所在文件夹外部

内容为:

cls

call "C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/vsvars32.bat"

 

devenv "test_ok/test_ok.sln" /build Debug_gtest

 

pause

自己搜索一下 vsvars32.bat 的路径,根据个人情况填写。

图表 12

4.5          执行批处理,通过编译,批处理有效

图表 13

4.6          修改一下批处理,把单元测试部分也加上执行一下

cls

call "C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/vsvars32.bat"

 

devenv "test_ok/test_ok.sln" /build Debug_gtest

 

pause

 

test_ok/debug_gtest/test_ok.exe

图表 14

 

              生成的测试结果在 D:/mystudy/cpp_repository/ test_result.xml

4.7          单元测试部分完毕。

5           SVN 服务器上传代码

5.1          打开 SVN 服务器

图表 15

5.2          二步,用在 VsualSVN 中分配的用户名登录

图表 16

5.3          上传我们刚刚编译过的工程

图表 17

5.4          上传完毕

图表 18

5.5          右键 test_mfc 项目 checkout 到本地

图表 19

5.6          上传 SVN 成功

6           配置 hudson

6.1          E:/apache-tomcat-7.0.2/bin/ startup.bat 批处理启动 tomcat

图表 20

6.2          浏览器中输入 http://localhost:8080/hudson/ 地址启动 hudson, 其中 localhost hudson 所在机器 IP 地址代替也可,如 http://192.168.1.226:8080/hudson/

图表 21

6.3          点击,系统管理—— > 系统设置,进行配置

图表 22

6.3.1     配置 JDK 地址,去掉“自动安装”属性。我在安装 JDK 时在环境变量中设置过了,按照我的安装路径来配置

JDK 别名 = JDK java_home =D:/haisoftware/Java/jdk1.6.0_10/

图表 23

6.3.2     我这是 MFC 项目,不管 ANT

6.3.3     Maven 路径

Maven name = mv    MAVEN_HOME = E:/apache-maven-2.2.1

图表 24

6.3.4     剩下的不用管,直接设置邮箱地址, save 保存

图表 25

6.4          点左上角,“新建任务”。

6.4.1     任务名称“ test_01 ”,选 Build a free-style software project

图表 26

 

图表 27

6.4.2     Source code management Subversion

6.4.2.1    Repository URL 输入要进行集成测试项目在 SVN 上的地址 如我的 http://pengdehai/svn/continuous_integration_pdh/cpp_repository/test_mfc

图表 28

 

6.4.2.2    点击右侧的问号 ,再点 this link ,在弹出的页面中输入 SVN 上工程的地址和访问用户名,密码

图表 29

 

6.4.2.3    Local module directory hudson SVN 上工程下载到 hudson 工作目录下进行处理的目录名。不填的话, hudson 默认为与 svn 上对应工程名称相同,如 test_mfc

 

6.4.3     设置自动测试间隔时间,选 Build Triggers —— >Poll SCM —— >schedule

输入“ * * * * * ”,注意星号间输入的是空格,这里定为 1 分钟从 SVN 上取下来编译一次。

6.4.4     选择集成方式, MFC 选调用批处理的方式,选择 Build —— >Execute windows batch command 输入批处理所在位置(我们是 test_mfc/go.bat

图表 30

图表 31

 

 

6.4.5     编译结束后 hudson 会通过 xml 文件检查单元测试的结果。我们的 MFC 通过 gtest 进行单元测试。结果存在 test_result.xml 中。 Gtest xml 文件与 junit 的结果类似,都符合 XUnit 格式,所以不用安装插件,直接在 JUnit 路径中填入路径即可。我们这里为 workspace 根目录下。

Post-build Actions —— >Public JUnit test result report —— >Test report XMLS

输入 test_result.xml 注意 test_result.xml 直接放在 workspace 根目录下,程序会自动删除老版本的 test_result.xml 文件,放在子目录下也许不会删除老版本, hudson 也许会直接报错。

图表 32

 

 

6.4.6     Post-build Actions E-mail notification

Reipients 输入你的邮箱地址,程序集成有问题,则会发邮件通知你。

图表 33

6.5          退到首页,点击右侧开始集成按钮,或等待一分钟

图表 34

红色球表示编译失败,蓝色表示成功,黄色表示编译成功, gtest 单元测试失败。

 

6.6          邮箱收到邮件,通知我们有刚提交的项目有错误。点击链接地址,看一下日志,查询原因。

图表 35

6.7          点击右键所指地址,进入命令行输出,发现是 go.bat 命令中的路径不对。

图表 36

             

6.8          因为 hudson 调用 go.bat 时,自动跳转到 hudson 的工作目录 E:/hudson_directory/jobs/test_01/workspace 下了。所以与我们的程序不符。在我们工作目录 D:/mystudy/cpp_repository/test_mfc/go.bat 中添加一行代码,查看当前目录,提交 SVN 。等待 hudson 再次编译,邮件通知我们。

cls

call "C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/vsvars32.bat"

 

echo %cd%

devenv "test_ok/test_ok.sln" /build Debug_gtest

 

pause

 

test_ok/debug_gtest/test_ok.exe

 

图表 37

6.9          查看结果知道 Go.bat workspace 目录下运行,而 test_ok.sln workspace/test_mfc/test_ok 目录下,修改 go.bat ,再次提交 SVN

cls

call "C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/vsvars32.bat"

 

echo " 我看看路径 "

echo %cd%

devenv "test_mfc/ test_ok/test_ok.sln" /build Debug_gtest

 

pause

 

test_mfc /test_ok/debug_gtest/test_ok.exe

 

 

6.10       再次提交,小球变黄,显示编译成功 gtest 测试用例有误差

图表 38

6.11       查看日志发现多了 Test Result 项,点击进入

图表 39

6.12       进入 Test Result 根据界面提示就可定位错误。

 

图表 40

 

图表 41

6.13       程序 test_ok.cpp 155 行测试用例有错,程序员希望返回 110 ,但 func_check 函数返回 15 。与程序员预期不符

图表 42

6.14       修改修改程序,使测试用例与所测函数相符,重新编译,邮件收到通知,集成及单元测试都成功,小球变蓝。查看日志,进度条全部蓝色,显示两个测试用例全部跑通。

图表 43

 

图表 44

      

图表 45

 

7           结语

有问题可以给我留言。

你可能感兴趣的:(hudson,单元测试,svn,mfc,测试,maven)