Test是一个跨平台的C++单元测试框架,由Google公司发布。它支持在Linux、Mac OS X、Windows、Cygwin和Windows CE以及Symbian等不同平台上编写C++测试。GTest提供了丰富的断言、致命和非致命判断、参数化以及“死亡测试”等功能。
GTest框架包括以下几种测试工具:
1. GTest Runner:
GTest Runner是一个基于Qt5的自动化测试运行程序和图形用户界面,适用于Windows和Linux平台。它具有强大的功能,可以方便地运行和管理测试用例。
2. Google Test UI:
Google Test UI是一个用于运行测试二进制文件的测试运行程序。它允许用户通过进度条跟踪测试的执行进度,并显示测试失败的列表。用户只需点击列表中的一个失败项,即可查看具体的故障文本。Google Test UI是用C#语言编写的。
3. GTest TAP Listener:
GTest TAP Listener是一个事件侦听器,用于Google Test框架。它实现了TAP协议,用于输出测试结果。如果您的测试运行程序支持TAP协议,那么使用GTest TAP Listener可能会对您有所帮助。
4. gtest-parallel:
gtest-parallel是Google Test的一个扩展模块,用于并行执行测试用例。它可以在多个线程或进程中同时运行测试,从而提高测试效率。这对于需要大量计算资源的测试非常有用。
## GTest Parallel
Gtest-parallel是一个运行程序,它可以并行地运行二进制文件中的测试用例,从而实现显著的加速。这种方式使得开发者能够在更短的时间内完成更多的测试用例,提高软件质量的同时,也能够更快地响应用户需求。
## Google Test Adapter
GoogleTest Adapter是VS Code的一款扩展插件,它允许用户以树状视图查看Google测试用例,同时还支持运行和调试这些测试用例。这款扩展插件极大地方便了开发者对Google测试框架的使用。
## 如何使用
在使用Gtest-parallel或者Google Test Adapter进行测试时,你需要首先"练习"特定的程序路径,并为其提供特定的输入值。然后,你需要验证这些输入值对应的结果是否符合预期。这就涉及到测试单元的概念。在Gtest中,一个测试单元通常由一组先决条件、输入、动作(如适用)、预期结果和后置条件组成。
## Simple Tests
要创建一个简单的测试,你可以使用`TEST()`宏定义和命名一个测试函数。在这些函数中,你可以包含任何有效的C++语句,同时使用各种googletest断言来检查值。以下是一个简单的例子:
```cpp
// 假设有一个名为add的函数,它接受两个整数参数并返回它们的总和。
int add(int a, int b) {
return a + b;
}
// 这是一个名为MyClass的类,其中有一个add成员函数。我们将在这个类上编写一些测试用例。
class MyClass {
public:
int add(int a, int b) {
return a + b;
}
};
// 然后你可以在你的测试代码中这样写:
TEST(MyClassTest, HandlesPositiveInput) {
MyClass my_class;
int result = my_class.add(5, 7); // 这里应该返回12
// 现在我们已经进行了一次实际的操作(调用了add函数),接下来就是断言部分,检查结果是否符合预期:
EXPECT_EQ(result, 12); // 如果实际的结果与预期的结果不符,这个测试就会失败。
}
```
The test's result is determined by the assertions; if any assertion in the test fails (either fatally or non-fatally), or if the test crashes, the entire test fails. Otherwise, it succeeds.
Google Test relies on assertions for its functionality. But what are assertions and how do they work?
An assertion in Google Test is similar to a macro function call. You can use them to test your classes or functions by asserting certain behaviors. When an assertion fails, Google Test prints the source file and line number position of the failing assertion along with the failure message.
There are two types of gtest assertion macros: ASSERT_family and EXPECT_family.
1. ASSERT_family: If the current point of detection fails, it will exit the current function.
2. EXPECT_family: If the current point of detection fails, it will continue to execute.
When it comes to bool value checks, both gtest and the standard library require that you use the comparison operators provided by the assert library. Failure to do so will result in a compilation error.
String comparisons also follow this same pattern, except "CASE" is used in the assertion names to ignore case sensitivity.
Exception handling can be used within assertions as well. However, it's important to keep in mind that exceptions should only be thrown when there is an unexpected condition that cannot be handled gracefully by normal execution flow. Otherwise, they can cause the test to fail unexpectedly.
Finally, testing cases are represented using test functions within a test case function. The first argument is the name of the test case and the second argument is the name of the individual test within that case. Both names must be valid C++ identifiers and should not contain underscores (_). The full name of a test consists of its containing test case and its individual name. Tests from different test cases can have the same individual name.
以下是内容重构后的代码示例,保持了原格式和段落结构:
```cpp
#include
// 示例测试用例1:OneAddZeroInput
TEST(addsumTest, OneAddZeroInput) {
int a = 1;
int b = 0;
EXPECT_EQ(a + b, 1);
}
// 示例测试用例2:addSomeInput
TEST(addsumTest, addSomeInput) {
int a = 5;
int b = 3;
EXPECT_EQ(a + b, 8);
}
// GoogleTest按测试用例对测试结果进行分组,因此逻辑上相关的测试应该在同一个测试用例中;换句话说,它们的TEST()的第一个参数应该相同。
// 在上面的例子中,我们有两个测试,OneAddZeroInput和addSomeInput,它们属于同一个测试用例addsumTest。
```