您的位置: 首页 - 站长

wordpress nickname网站排名seo教程

当前位置: 首页 > news >正文

wordpress nickname,网站排名seo教程,上海有什么大公司,网站的开发语言TOC gtest介绍 gtest是google的一个开源框架#xff0c;它主要用于写单元测试#xff0c;检查自己的程序是否符合预期行为。可在多个平台上使用#xff08;包含Linux#xff0c;MAC OC#xff0c;Windows等#xff09;。它提供了丰富的断言#xff0c;致命和非致命失败…TOC gtest介绍 gtest是google的一个开源框架它主要用于写单元测试检查自己的程序是否符合预期行为。可在多个平台上使用包含LinuxMAC OCWindows等。它提供了丰富的断言致命和非致命失败判断能进行值参数化测试类型参数化测试“死亡测试”。 断言 一般的要测试一个方法函数是否是正常执行的可以提供一些输入数据在调用这个函数后会得到输出结果然后检查输出的数据是否与我们期望的结果是一致的若一致则说明这个方法的逻辑是正确的否则就有问题。 在对输出结果进行检查的时候gtest为我们提供了一系列的断言进行代码测试这些宏有点类似于函数调用。当断言失败时gtest将会打印出assertion时的源文件和出错行的位置以及附加的失败信息。这些输出的附加信息用户可以直接通过operator 在这些断言宏后面。 gtest中断言的宏可以分为两种一类是ASSERT系列一类是EXPECT类。 区别ASSERT不通过的时候会认为是一个指明的错误退出当前函数只是函数)。而EXPECT失败之后会继续运行当前函数所以对于函数内的几个失败可以同时报告出来通常用我们EXPECT级别的断言即可除非你认为当前检查点失败后函数的后续检查没有意义。 布尔类型检查 致命断言非致命断言验证ASSERT_TRUE(状态)EXPECT_TRUE(状态)条件为真ASSERT_FALSE(状态)EXPECT_FALSE(状态)条件为假 二值检查 致命断言非致命断言验证ASSERT_EQ(期望值 实际值)EXPERT_EQ(期望值 实际值)期望值 实际值ASSERT_NE(值1 值2)EXPERT_NE(值1 值2)值1 ! 值2ASSERT_LT(值1 值2)EXPERT_LT(值1 值2)值1 值2ASSERT_LE(值1值2)EXPERT_LE(值1 值2)值1 值2ASSERT_GT(值1 值2)EXPERT_GT(值1 值2)值1 值2ASSERT_GE(值1值2)EXPERT_GE(值1 值2)值1 值2 字符串检查 致命断言非致命断言 验证 ASSERT_STREQ(字符串1 字符串2)EXPECT_STREQ(字符串1 字符串2)两个C字符串具有相同的内容ASSERT_STRNE(字符串1 字符串2)EXPECT_STRNE(字符串1 字符串2)两个C字符串有不同的内容ASSERT_STRCASEEQ(字符串1 字符串2)EXPERT_STRCASEEQ(字符串1 字符串2)两个C字符串具有相同的内容忽略大小写ASSERT_STRCASENE(字符串1 字符串2)EXPECT_STRCASENE(字符串1 字符串2)两个C字符串的内容不同忽略大小写 宏测试 TEST宏 TEST宏的第一个参数是test_case_name(测试套件名)第二个参数是test_name(测试特例名) 测试套件Test Case是为某个特殊目标而编制的一组测试输入执行条件以及预期结果以便测试某个程序路径或核实是否满足某个特定需求。 测试特例名是测试套件下的一个测试 举例 #include iostream #include gtest/gtest.husing namespace std;TEST(MATHTEST, test1) {ASSERT_EQ(10, 10); // 成功EXPECT_NE(10, 10); // 失败但是会继续执行ASSERT_TRUE(10 0); // 成功EXPECT_FALSE(10 1); // 成功 }int main(int argc, char* argv[]) {testing::InitGoogleTest(argc, argv);return RUN_ALL_TESTS(); } TEST_F宏 使用TEST_F前需要创建一个固定类继承testing::Test类 在类内部使用public或者protected描述其成员为了保证实际执行的测试子类可以使用其成员变量。在构造函数或者继承于::testing::Test类中的SetUp方法中可以实现我们需要构造的数据。在析构函数或者继承于::testing::Test类中的TearDown方法中可以实现一些资源释放的代码。 这里需要注意四个函数 //测试环境测试夹具类中可以实现四个函数static void SetUpTestCase() //在测试某个测试套件时在执行第一个测试用例前执行static void TearDownTestCase() //在测试某个测试套件时在执行完最后一个测试用例后执行virtual void SetUp() override //在测试某个测试套件时在执行每一个测试用例前执行virtual void TearDown() override //在测试某个测试套件前在执行完每一个测试用例后执行第一个参数为测试套件名必须与创建的固件类名一致第二个为测试名可任意取。 TEST_F宏和TEST宏的实现接近只是TEST_F宏的封装更加开放一些对TEST宏的功能多了一些扩展。 TEST_F与TEST的区别TEST_F提供了一个初始化函数SetUp和一个清理函数TearDown。在TEST_F中使用的变量可以在初始化函数SetUp中初始化在TearDown中销毁。所有的TEST_F是互相独立的都是在初始化以后的状态开始运行。一个TEST_F不会影响另一个TEST_F所使用的数据多个测试场景需要相同数据配置的情况用TEST_F。 举例 #include iostream #include gtest/gtest.h #include vector #include algorithmusing namespace std;vectorint global_vector;class VectorTest : public testing::Test { public:static void SetUpTestCase(){cout VectorTest测试套件开始测试 endl;global_vector {9, 5, 6, 2, 8, 7, 1, 3, 4};}static void TearDownTestCase(){cout VectorTest测试套件结束测试清理数据 endl;global_vector.clear();}void SetUp() override{cout VectorTest测试套件中新的一场测试开始测试 endl;global_vector {9, 5, 6, 2, 8, 7, 1, 3, 4};}void TearDown() override{cout VectorTest测试套件中旧的一场测试结束测试清理数据 endl;global_vector.clear();} };TEST_F(VectorTest, sortVector) {sort(global_vector.begin(), global_vector.end());for(int i 0; i global_vector.size(); i){cout global_vector[i] ;}cout endl; }TEST_F(VectorTest, reductVector) {for(int i 0; i global_vector.size(); i){cout global_vector[i] ;}cout endl; }TEST(MYTEST, test1) {if(global_vector.empty()){cout 数组已经清空 endl;}else{cout 数组没有清空 endl;} }int main(int argc, char* argv[]) {testing::InitGoogleTest(argc, argv);return RUN_ALL_TESTS(); } TEST_P宏 在设计测试案例时经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法然后编写在测试案例调用它。即使使用了通用方法这样的工作也是有很多重复性的。 用TEST这个宏需要编写如下的测试案例每输入一个值就需要写一个测试点这还只是在一个测试中如果把每个测试点单独创建一个测试工作量就更大。使用TEST_P这个宏对输入进行参数化就简单很多 举例 #include iostream #include gtest/gtest.h #include vector #include algorithmusing namespace std;class positiveTest : public testing::TestWithParamint { public:static void SetUpTestCase(){cout VectorTest测试套件开始测试 endl;}static void TearDownTestCase(){cout VectorTest测试套件结束测试清理数据 endl;}void SetUp() override{cout VectorTest测试套件中新的一场测试开始测试 endl;}void TearDown() override{cout VectorTest测试套件中旧的一场测试结束测试清理数据 endl;} };class negativeTest : public testing::TestWithParamint { public:static void SetUpTestCase(){cout VectorTest测试套件开始测试 endl;}static void TearDownTestCase(){cout VectorTest测试套件结束测试清理数据 endl;}void SetUp() override{cout VectorTest测试套件中新的一场测试开始测试 endl;}void TearDown() override{cout VectorTest测试套件中旧的一场测试结束测试清理数据 endl;} };INSTANTIATE_TEST_SUITE_P (positiveValues,positiveTest,testing::Values(9, 5, 6, 2, 8, 7, 1, 3, 4) );INSTANTIATE_TEST_SUITE_P (negativeValues,negativeTest,testing::Values(-9, -5, -6, -2, -8, -7, -1, -3, -4) );TEST_P(positiveTest, Test1) {int param GetParam();EXPECT_GT(param, 0);}TEST_P(negativeTest, Test1) {int param GetParam();EXPECT_LT(param, 0);}int main(int argc, char* argv[]) {testing::InitGoogleTest(argc, argv);return RUN_ALL_TESTS(); } 预处理事件机制 gtest 提供了多种预处理事件机制方便我们在测试之前或之后做一些操作。

  1. 全局的所有测试执行前后。
  2. TestSuite级别的在某测试套件中第一个测试前最后一个测试执行后。
  3. TestCase级别的每个测试前后。 1.全局事件 要实现全局事件必须写一个类继承testing::Environment类实现里面的SetUp和TearDown方法。 1. SetUp()方法在所有案例执行前执行。 2. TearDown()方法在所有案例执行后执行。 还需要在main函数中通过调用testing::AddGlobalTestEnvironment这个函数将事件挂进来也就是说我们可以写很多个这样的类然后将他们的事件都挂上去AddGlobalTestEnvironment这个函数要放在RUN_ALL_TEST之前。 int main() {testing::AddGlobalTestEnvironment(new FooEnvir);testing::InitGoogleTest();RUN_ALL_TESTS();return 0; } 2.TestSuites事件 需要写一个类继承testing::Test然后实现两个静态方法 1. SetUpTestCase() 方法在第一个TestCase之前执行。 2. TearDownTestCase() 方法在最后一个TestCase之后执行。 3.TestCase事件 TestCase事件是挂在每个案例执行前后的实现方式和TestSuites的几乎一样不过需要实现的是SetUp方法和TearDown方法
  4. SetUp()方法在每个TestCase之前执行。
  5. TearDown()方法在每个TestCase之后执行。