Catch2 框架有 SECTION 的概念,这似乎使单元测试代码更具可读性。为了了解在 Catch2 与 GoogleTest 中编写某些测试有多容易,我正在尝试找出翻译给定 Catch2 示例代码的最佳方法
#include <catch2/catch_test_macros.hpp>
TEST_CASE( "vectors can be sized and resized", "[vector]" ) {
std::vector<int> v{1, 2, 3, 4, 5};
REQUIRE(v.size() == 5);
REQUIRE(v.capacity() == 5);
SECTION( "A) reserving bigger changes capacity but not size" )
{
v.reserve(10);
REQUIRE(v.size() == 5);
REQUIRE(v.capacity() >= 10);
SECTION( "A.1) reserving down unused capacity does not change capacity" )
{
v.reserve(7);
REQUIRE(v.size() == 5);
REQUIRE(v.capacity() >= 10);
}
v[0] = 42;
SECTION( "A.2) shrink_to_fit is a non binding request to reduce capacity() to size()")
{
v.shrink_to_fit();
REQUIRE(v.capacity() >= v.size());
}
}
}
到谷歌测试。我目前有
#include <gtest/gtest.h>
#include <vector>
class VectorTest : public ::testing::Test
{
protected:
void SetUp() override
{
EXPECT_EQ(v.size(), 5);
EXPECT_EQ(v.capacity(), 5);
}
std::vector<int> v{1, 2, 3, 4, 5};
};
TEST_F(VectorTest, SectionA1)
{
// reserving bigger changes capacity but not size
v.reserve(10);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
// reserving down unused capacity does not change capacity
v.reserve(7);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
v[0] = 42;
}
TEST_F(VectorTest, SectionA2)
{
// reserving bigger changes capacity but not size
v.reserve(10);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
v[0] = 42;
// shrink_to_fit is a non binding request to reduce capacity() to size()
v.shrink_to_fit();
EXPECT_GE(v.capacity(), v.size());
}
这似乎比 Catch2 代码更冗长且可读性更差。
我想知道是否还有其他更优雅/可读/更短的方法来做到这一点?
如果“否”,那么这将是使用 Catch2 的一个论据。
几乎一样:
TEST(VectorTest, Resize) {
std::vector<int> v{1, 2, 3, 4, 5};
EXPECT_EQ(v.size(), 5);
EXPECT_EQ(v.capacity(), 5);
{
SCOPED_TRACE("A) reserving bigger changes capacity but not size")
v.reserve(10);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
{
SCOPED_TRACE("A.1) reserving down unused capacity does not change capacity")
v.reserve(7);
EXPECT_EQ(v.size(), 5);
EXPECT_GE(v.capacity(), 10);
}
v[0] = 42;
{
SCOPED_TRACE("A.2) shrink_to_fit is a non binding request to reduce capacity() to size()")
v.shrink_to_fit();
EXPECT_EQ(v.capacity(), v.size());
}
}
}