用NUnit跑C#和C++的单元测试 单元测试代码
这几天打算用个自动化的单元测试框架来组织一些case,因为之前用过CppUnit,第一感觉就是用它吧。刚好今天有个项目组做一个关于用NUnit的sharing,而且是兼容并包managed和native的case。想想可能能受到些启发,便跑去听了一下。
他们用的测试框架当然是NUnit,跑C#的case自然不在话下,可是如何跑C++的case呢?绝对不是CppUnit的改装,而是另外一套东西,有同学已经做出一个现成的工具了:GenTestAsm.,基本步骤如下:
1. 用C++写case,并export。
2. 解析C++ DLL文件,得到export的case
3. 自动写C#代码调用这些export的case(看着高深,可有规律的东西就肯定能自动化)
4. 编译产生的assemly就可以直接在NUnit里面跑了。
很酷!
顺便记下几点:
1. NUnit和被测代码是在同一个进程里面,很容易由于被测代码引起整个测试框架的crash,那么拿到最终的report就会有问题。虽说C#的case不容易crash(没有指针?),但通过上述方法调用C++,让它crash不是件难事。所有最好是能做进程外测试。
2. NUnit使用shared copy的方法,使真正load进来的dll并不是你编译出来的那个,而是另外拷了一个,这样就在可以在不关闭NUnit的情况下rebuild被测工程。当然,GetTestAsm也提供了Thunk DLL的技术,在每个case开始时load DLL, 结束时unload DLL,也就达到了这种效果。
3. VC++中Additional Dependencies除了lib,还能加obj,这样另外一个工程中的代码就可以直接编译进本工程了。这么做的目的是希望使用另外一个DLL中的未export的函数。但是因为obj不是同一个工程编译出来的,一些工程设置上的不同可能会引起问题。
4. LoadLibrary是可以load一个exe的,MSDN也说明了 --- 我竟然以前都没注意到。当然,写一个exe纯粹为了当dll那就有点不和谐了。我遇到过的在exe里export函数,是为了在同一进程中的插件里使用这些函数。
不错,可以考虑一下用NUnit,这样case既可以是C#的,也可以是C++的,比较灵活。
文章来源于领测软件测试网 https://www.ltesting.net/