单元测试乱弹(一):悲剧的测试工具
项目要结束了,按流程需要做单元测试并提交测试报告。本来公司内部有测试工具,拿过来直接用就是。但实际上一堆问题,在这里不吐不快。
(1)首先尝试的是测试工具XXTest,但竟然编译不通过。打开代码一看,顿时跪倒:
1 MTString log = ""; 2 log += "Time: "; 3 log += (int)MTTime::GetTime().GetStr();
string居然强制转为int!
1 char buff[4096]; 2 memset(buff, 0x00, 4096); 3 sprintf(buff, "%d",(int) ptr);
打印指针,竟然也强制转为int. 不会用 %p么?
告诉支持人员编译通不过,他们回复:“我这里好的很,这是外国人写的!”。
我推测,可能是编译环境不一致引起的,也许这样的代码在他们的机器上可以通过,但在我这边却肯定是有问题的(后来证实了这一点,他们的编译器是4.1,而我们的是g++ (Debian 4.7.1-7) 4.7.1)。
还好问题不大,就自己先fix了。
继续编译,报错:
1 /usr/bin/ld: Warning: size of symbol `_ZN8MTObjectD1Ev' changed from 8 in /tmp/cc3dhwh4.o to 14 in ./lib/libMTCore.a(MTCore-Linux.o) 2 /usr/bin/ld: Warning: size of symbol `_ZN12MTRepositoryD1Ev' changed from 36 in /tmp/cc3dhwh4.o to 44 in ./lib/libMTCore.a(MTCore-Linux.o) 3 /usr/bin/ld: i386 architecture of input file `./lib/libMTCore.a(MTCore-Linux.o)' is incompatible with i386:x86-64 output 4 ./lib/libMTCore.a(MTCore-Linux.o): In function `MTList::AddBefore(void*)': 5 /home/MyTest_Linux_C++/MTCore/MTList.cpp:148: undefined reference to `operator new(unsigned int)' 6 ./lib/libMTCore.a(MTCore-Linux.o): In function `MTList::AddAfter(void*)': 7 /home/MyTest_Linux_C++/MTCore/MTList.cpp:100: undefined reference to `operator new(unsigned int)'
似乎是“libMTCore.a”不兼容,这个库是支持部门事先编译好提供给我们的。
一问下来,他们是在32位Ubuntu上编译的,而我们是在64位Debian上编译的(项目要求的,无法更改),能链接的上才怪。
问是否能提供64位版本,被告知该程序已不再维护。
(2)还好有替代工具XXX, 但是文档看下来,复杂无比,而操作过程语焉不详,无从下手。
询问支持人员,被告知没有人用过,需要自己摸索,有问题需要HQ(总部)支持。这是个费时费力的活,而我们只有一周的时间,可能工具还没学会,就得交报告。因此,头儿决定:不用这些坑爹的玩意了,手动测试,或者寻找外部测试工具吧。
(3)c++ 单元测试工具,开源的一大堆。就使用google test吧,代码、使用方法都还比较简单,就是它了!
PS: 经过此事,我们内部达成的一直意见时:下个项目,就上python!因为可以不写单元测试。。。