解读sample2
说明
被测试代码文件 | sample2.h、sample2.cc |
测试代码文件 | sample2_unittest.cc |
官网上如是描述sample2:
Sample #2 shows a more complex unit test for a class with multiple member functions.
sample1演示了如何使用gtest来对一个类以及它的成员函数进行单元测试。
为了让sample2的代码能尽快地跑起来,我把sample2的代码文件直接添加到sample1使用的工程中进行编译。
理解被测试代码
被测试代码是一个字符串的封装类:class MyString
理解测试代码:组织关系
在sample1中,我们使用TEST宏来组织针对全局函数的单元测试代码。在sample2中,测试的对象由function变成了class,我们依然可以使用TEST宏来组织单元测试代码,详情如下:
被测试的类 | class MyString |
test case name | MyString |
- test name 1 | DefaultConstructor:测试默认构造函数 |
- test name 2 | ConstructorFromCString:测试构造函数explicit MyString(const char* a_c_string) |
- test name 3 | CopyConstructor:测试拷贝构造函数MyString(const MyString& string) |
- test name 4 | Set:测试成员函数void Set(const char* c_string) |
我能够从sample1和sample2中感觉到gtest在易用性方面的努力,有可能这跟我使用过CppUnit有关。易用性的意思是,能够让人把更多的精力集中在测试这件事情上面,而不需要太多地关注框架本身的使用问题。
理解测试代码:检查字符串比较结果的断言
对class MyString进行单元测试的时候,sample2_unittest.cc中使用了一组检查字符串比较结果的断言:
致命断言(Fatal assertion) | 非致命断言(Nonfatal assertion) | 预期结果(Verifies) |
ASSERT_STREQ(expected, actual); | EXPECT_STREQ(expected_str, actual_str); | 两个C字符串有相同的内容 |
ASSERT_STRNE(expected, actual); | EXPECT_STRNE(str1, str2); | 两个C字符串有不同的内容 |
ASSERT_STRCASEEQ(expected, actual); | EXPECT_STRCASEEQ(expected_str, actual_str); | 忽略大小写,两个C字符串有相同的内容 |
ASSERT_STRCASENE(expected, actual); | EXPECT_STRCASENE(str1, str2); | 忽略大小写,两个C字符串有不同的内容 |