PART 1:
参考:http://hahack.com/codes/cmake/
Demo目录结构如下:
Test/
├── add.cpp
└── CMakeLists.txt
add.cpp
#include <iostream>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc != 3) {
std::cout << "parameter error" << std::endl;
return -1;
}
int a, b;
a = atoi(argv[1]);
b = atoi(argv[2]);
std::cout << a << " + " << b << " is " << a + b << std::endl;
return 0;
}
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.3)
ADD_EXECUTABLE(add add.cpp)
enable_testing()
ADD_TEST(NAME test_add_2_3 COMMAND add 2 3)
SET_TESTS_PROPERTIES(test_add_2_3
PROPERTIES PASS_REGULAR_EXPRESSION "5")
ADD_TEST(NAME test_add_4_5 COMMAND add 4 5)
SET_TESTS_PROPERTIES(test_add_4_5
PROPERTIES PASS_REGULAR_EXPRESSION "9")
在CMakeLists.txt里面,我们添加了两个测试用例。其中 PASS_REGULAR_EXPRESSION 用来测试输出是否包含后面的字符串。
在Test目录下建立build目录,cd build && cmake .., make, make test, 结果如下:
huyanjie@debian:~/test/Test/build$ make test
Running tests...
Test project /home/huyanjie/test/Test/build
Start 1: test_add_2_3
1/2 Test #1: test_add_2_3 ..................... Passed 0.00 sec
Start 2: test_add_4_5
2/2 Test #2: test_add_4_5 ..................... Passed 0.00 sec
100% tests passed, 0 tests failed out of 2
Total Test time (real) = 0.01 sec
可以看到两个用例都正确执行了。
像上面的方式写测试用例还是比较繁琐,还可以定义宏来简化:
CMAKE_MINIMUM_REQUIRED(VERSION 3.3)
ADD_EXECUTABLE(add add.cpp)
enable_testing()
macro(do_test ARG1 ARG2 RESULT)
ADD_TEST(NAME test_add_${ARG1}_${ARG2} COMMAND add ${ARG1} ${ARG2})
SET_TESTS_PROPERTIES(test_add_${ARG1}_${ARG2}
PROPERTIES PASS_REGULAR_EXPRESSION ${RESULT})
endmacro(do_test)
do_test(2 3 5)
do_test(4 5 9)
PART 2:
CPPUNIT使用如下:
参考http://blog.csdn.net/freefalcon/article/details/753819
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TextOutputter.h>
#include <cppunit/TestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
class StringTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(StringTest);
CPPUNIT_TEST(testSwap);
CPPUNIT_TEST(testFind);
CPPUNIT_TEST_SUITE_END();
public:
void setUp()
{
m_str1 = "Hello, world";
m_str2 = "Hi, cppunit";
}
void tearDown()
{
}
void testSwap()
{
std::string str1 = m_str1;
std::string str2 = m_str2;
m_str1.swap(m_str2);
CPPUNIT_ASSERT(m_str1 == str2);
CPPUNIT_ASSERT(m_str2 == str2);
}
void testFind()
{
int pos1 = m_str1.find(',');
int pos2 = m_str2.rfind(',');
CPPUNIT_ASSERT_EQUAL(5, pos1);
CPPUNIT_ASSERT_EQUAL(2, pos2);
}
protected:
std::string m_str1;
std::string m_str2;
};
CPPUNIT_TEST_SUITE_REGISTRATION(StringTest);
int main(int argc, char *argv[])
{
CppUnit::TestResult r;
CppUnit::TestResultCollector rc;
r.addListener(&rc);
CppUnit::TestRunner runner;
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
runner.run(r);
CppUnit::TextOutputter o(&rc, std::cout);
o.write();
return rc.wasSuccessful()?0:-1;
}
PART 3
CMake 结合CPPUnit