- 编译时,针对每个cpp测试文件生成一个so。(链接次数多,耗时长,而且很难并行 make -j 也不能起作用)
- 编译的 CMakeList.txt 较复杂。
- 之前修改被测cpp,可能不能重新编译测试的so。(增加测试target对被测.a的依赖也许可以解决)
- 测试用例在多个so文件中,如果去掉用例时,只是修改CMakeLists.txt,不删除so,则运行时还是运行了它,增加定位成本。
- 运行时需要较多参数,新手会觉得困难
- 当前运行时可能遇到so无法加载, 虽然经优化已经好转。
- Android上部分so加载不成功。
- 动态库移到其它编译环境(如编译器版本)很可能不能运行,而静态库可以用的可能性大一些。
- 编译所有 cpp 测试文件 并链接 libtestngpp.a 生成一个测试文件。
-
字符串比较,需要实现一个打印错误信息更友好的方式,能直接打印对比的字符串,而不是二进制数。
-
在一个测试 .h 中增加很多行注释,然后编译报错:D:\Develop\cpp\learn-cpp\gen_testsuites\ut_TestRightValueOld.cxx(35,18): error C2039: "test_56": 不是 "TestTestRightValue" 的成员 [D:\Develop\cpp\learn-cpp\build\tests\ut\LearnCppTests.vcxproj] (猜测的原因是.h中增加注释,引起TEST所在行号变化,但是概率出现cmake不自动生成cxx文件,从而编译报错。可以用__COUNTER__代替__LINE__,同时修改testngppgen python脚本,脚本修改难度较大,测试场景也较多。暂时可通过删除自动生成的cxx文件重新生成解决。如果此问题出现概率高再考虑修改。)
-
fixture filter看起来支持:分隔,还未测试。tag filter暂未测试。
-
python解析和处理测试.h文件时,针对FIXTURE和TEST后面{未换行的情况作编译报错,或者作兼容处理。
-
如果开启mem checker,则用例执行结束,没有汇总的测试报告出来。(win上有问题,linux没问题)(SimpleTestCaseRunner::run)
-
xml output未支持。
-
确认xml, stdout输出切换命令,不用加载so的方式。
-
支持BDD类型的测试。
-
未测试的testngpp-runner老的命令行参数(tag):-t"* > succ > nothing" -c10
-
改名一个测试.h文件,会导致运行出错,提示一个老的.h对应的suite不能加载。因为AllTestSuites.cxx 中仍然保留了老的.h对应的信息。解决办法:生成 AllTestSuites.cxx时,总是根据现有的测试 .h 生成,并且去掉原来的列表内容。另外,老的测试.h对应的cxx文件不会自动删除。--很难改,除非构建脚本中每次删除 AllTestSuites.cxx 重新生成。因为处理每个测试 .h 文件时,是查找列表是否已存在,不存在则插入。没法删除老的。如果每次删除它,又不利于增量构建。因此只是在报错时加提示。
-
测试用例中的中文字符,Windows上MSVC编译结果在命令行输出时显示为乱码。(解决办法:增加编译选项 /source-charset:utf-8)
-
写一个sample工程,使得构建脚本最小化。参考samples目录样例CMakeLists即可。
-
把测试用例相关的cmake配置放到sample目录的CMakeList.txt
-
testngpp2自身的测试用例,还是用的testngpp和mockcpp来支持的。
-
Linux下编译运行。
-
filter fixtures 可能不支持多个 -f 选项.
-
写一个用法的帮助文档。
-
如果只是删除生成的cxx,而构建结果临时文件未删除,则不会自动生成cxx。最终报错 AllTestSuites.cxx文件找不到。(即使修改.h也不会生成, 自定义命令OUTPUT增加AllTestSuites.cxx即可)
-
支持自动搜索测试用例 .h 文件。
-
Listener的类型和选项未传入。
-
listener相关参数均为空。
-
filter tags 需要测试.
-
增加一个全局选项,替代掉 -l listener 以及它的参数。
-
findSymbol重复,且不支持linux平台。需重构。
-
当前 TestXXX.cxx 和 AllTestSuites.cxx 都不能在没有修改时,保持原来修改时间。会影响增量编译。(可能cmake已处理,依赖的.h未变,则不生成cxx; 如果.h改变则重新生成。)
-
增加到cmakelist的自动生成testsuites cxx文件的命令,可能不能正常工作。(如果文件已存在才能工作)
-
利用原来的编译脚本,把新的项目编译通过。
-
简化CMakeList.txt, 直接添加cpp文件到一个CMakeList.txt。
-
编译成可执行文件,运行看是否异常。
-
带上-l listener参数,可以打印信息; 带上 test dll 路径(正确与否随意),可以找到已编译进exe的__testngpp_test_suite_desc_getter函数,从而读取编译进exe的唯一的testsuite并运行它。
-
把所有测试cpp文件编译进exe,并且把它们的suite名称(cpp文件名)注册到一个表。
-
修改python script在生成测试cpp的同时,生成所有测试列表的文件。
- python脚本 -d 指定生成文件所在目录
- 生成的 cpp 文件名, 增加前缀 prefix_,其中prefix可以用 -p prefix 选项指定。
- 在-d 指定的目录生成 AllTestSuites.cpp 文件.
-
研究用例运行的触发机制,之前通过load so触发,现在要自动把用例列表弄出来。原来通过命令行参数中的每个suite so加载触发用例运行。
-
用直接编译成可执行文件方式运行sample程序。
-
先改testngpp所有cpp链接成一个.a,作为被测对象。
-
然后改 testngppst 支持编译成一个可执行文件,从而运行测试。
-
重构目录,把不同平台对应的实现分开。便于在构建脚本中管理。(不同平台差异较小,估计不需要改多少)
-
确认ResourceCheckPoint是否还需要,不需要去掉。(可能检查文件关闭方面有用)
-
确认Sandbox是否需要,不需要去掉。
{
"version": "0.2.0",
"configurations": [
{
"name": "(Windows) 启动",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build/src/Debug/testngpp-runner.exe",
"args": ["${workspaceFolder}/build/src/Debug/mockcpp-ut-TestAny.dll", "-l\"testngppstdoutlistener -c -v\"", "-m"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "externalTerminal"
},
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args":[
"-e", "utf-8",
"-o", "D:/Develop/test_tools/testngpp2/build_sample/sample.cpp",
"D:/Develop/test_tools/testngpp2/samples/TestFoo.h"
]
}
]
}
#include <vector>
#include <string>
static const std::vector<std::string> __all_test_suites{
"sample"
};
extern "C" const std::vector<std::string>& ___testngpp_get_all_test_suites() {
return __all_test_suites;
}
每个 TestXXX.h 自动生成 一个 ut_TestXXX.cxx,它就是一个 Test Suite.
testngpp-runner.exe [options]
Use options to show this help list:
-h : show this help list
Use options to control output:
-o stdout[-c-s-f-t-v-l3] : output to standard output
or
-o xml:path/to/file : output to specified xml file
The meanings of stdout sub-options are:
-c : colourful
-s : show suite name
-f : show suite name and fixture name
-t : show tags
-v : show verbose info
-l level : set output level (0 ~ 3)
The default output is: -o stdout-c-v.
Use options to control running testcase scope:
-f pattern : filter patterns
-t pattern : tags filter pattern
Use options to control function:
-m : not use memory leak checker
testngppgen [-e encoding] -d target_dir -p prefix testsuite1.h
自动在 target_dir 生成: prefix_testsuit1.cpp
测试命令: python D:\Develop\projects\test_tools\testngpp2\scripts\testngppgen.py -e utf-8 -d D:\Develop\projects\test_tools\testngpp2\build_sample2 D:\Develop\projects\test_tools\testngpp2\samples\TestBar.h D:\Develop\projects\test_tools\testngpp2\samples\TestMemLeak.h 发现这个命令会生成一个 TestMemLeak.cpp 和 TestBar.cxx,后者包含了两个.h的测试用例。(.cxx是汇总所有suite的文件,只有它导出了___testngpp_test_suite_desc_getter_TestMemLeak) 为了避免多个suite合并,可以用 -d 参数指定目录,但是只传一个测试 .h 文件。它会自动生成一个cxx文件,导出的符号带有suite name。 还需要考虑如何把 prefix 加上去。加到 suite name里面。 并且把 suite name 加到 AllTestSuites 列表,如果该列表有更新,则写文件,否则不写文件。
prefix 需要能成为 c++ 的标识符,可以用字母和下划线。
python.exe D:/Develop/test_tools/testngpp2/scripts/testngppgen.py -d D:/Develop/test_tools/testngpp2/gen_testsuites -p ut_ D:/Develop/test_tools/testngpp2/samples/TestBar.h
- test fixture表始终在item最后加一个0元素,避免数组元素个数是0的时候出错。我们用vector则不存在此问题,而且构造时初始化参数,不用一个一个add。新的c++真的好用很多。