doctest+FakeIt+nanobench(现代C++测试工具链)可以完美地替代gtest/gmock和google bench
没有任何依赖,无需安装,直接包含头文件就可以用,非常容易集成和使用

doctest

  1. #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
  2. #include "doctest.h"
  3. TEST_CASE("vectors can be sized and resized") {
  4. std::vector<int> v(5);
  5. REQUIRE(v.size() == 5);
  6. REQUIRE(v.capacity() >= 5);
  7. SUBCASE("adding to the vector increases it's size") {
  8. v.push_back(1);
  9. CHECK(v.size() == 6);
  10. CHECK(v.capacity() >= 6);
  11. }
  12. SUBCASE("reserving increases just the capacity") {
  13. v.reserve(6);
  14. CHECK(v.size() == 5);
  15. CHECK(v.capacity() >= 6);
  16. }
  17. }

SUBCASE

  • 允许在当前case下增加更多的子case去测试一些special一些的东西,非常实用,这也是相比gtest更好的一个地方。

断言宏

  1. CHECK宏是只检查并不会终止测试
  2. REQUIRE宏则会终止测试和gtest里面的ASSET_XX宏类似

这两个宏也是平时做单测时用得最多的两个宏了

除此之外,还有更丰富的宏。比如:

  1. <LEVEL> is one of 3 possible: REQUIRE/CHECK/WARN.
  2. <LEVEL>_EQ(left, right) - same as <LEVEL>(left == right)
  3. <LEVEL>_NE(left, right) - same as <LEVEL>(left != right)
  4. <LEVEL>_GT(left, right) - same as <LEVEL>(left > right)
  5. <LEVEL>_LT(left, right) - same as <LEVEL>(left < right)
  6. <LEVEL>_GE(left, right) - same as <LEVEL>(left >= right)
  7. <LEVEL>_LE(left, right) - same as <LEVEL>(left <= right)
  8. <LEVEL>_UNARY(expr) - same as <LEVEL>(expr)
  9. <LEVEL>_UNARY_FALSE(expr) - same as <LEVEL>_FALSE(expr)

判断异常的宏

  1. CHECK_THROWS_AS(func(), const std::exception&);
  2. CHECK_THROWS_AS(func(), std::exception); // same as above
  3. CHECK_THROWS_WITH(func(), "invalid operation!");
  4. CHECK_THROWS_WITH_AS(func(), "invalid operation!", std::runtime_error);
  5. <LEVEL>_NOTHROW(expression)

Fakelt(Mock库)

用doctest+FakeIt两个header only的库就可以完美替代gtest了。

FakeIt是C++11写的header only的mock库,用起来也很方便:

  1. struct SomeInterface {
  2. virtual int foo(int) = 0;
  3. virtual int bar(string) = 0;
  4. };
  5. Mock<SomeInterface> mock;
  6. When(Method(mock,foo)).Return(0);
  7. SomeInterface &i = mock.get();
  8. // Production code
  9. i.foo(1);
  10. // Verify method mock.foo was invoked.
  11. Verify(Method(mock,foo));
  12. // Verify method mock.foo was invoked with specific arguments.
  13. Verify(Method(mock,foo).Using(1));

nanobench

nanobench也是C++11写的header only的库,使用起来也很简单,包含头文件即可。

  1. #define ANKERL_NANOBENCH_IMPLEMENT
  2. #include <nanobench.h>
  3. int main() {
  4. double d = 1.0;
  5. ankerl::nanobench::Bench().run("some double ops", [&] {
  6. d += 1.0 / d;
  7. if (d > 5.0) {
  8. d -= 5.0;
  9. }
  10. ankerl::nanobench::doNotOptimizeAway(d);
  11. });
  12. }

参考文章

  1. 现代C++测试工具链(是时候抛弃gtest/google bench了)