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

企业的网站开发费用如何入账哔哩哔哩黄页网站

企业的网站开发费用如何入账,哔哩哔哩黄页网站,深圳网站制作公司兴田德润电话多少,做企业网站的介绍 GTest 是一个 跨平台的 C 单元测试框架,由 google 公司发布。 gtest 是为了在不同平台上为编写 C 单元测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化等等测试所需的宏,以及全局测试,单元测试组件。 安装 Ubuntu下…

介绍

GTest 是一个 跨平台的 C++ 单元测试框架,由 google 公司发布。 gtest 是为了在不同平台上为编写 C++ 单元测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化等等测试所需的宏,以及全局测试,单元测试组件。

安装

Ubuntu下使用如下命令进行安装

sudo apt-get install libgtest-dev

安装好后,就会在 /usr/include 目录下生成 gtest 文件夹,在该文件夹下就包含了 flags.h 头文件。

同时可以通过以下命令查看 gtest 动态库的位置。

whereis libgtest.a

使用

包含头文件

#include <gtest/gtest.h>

框架初始化接口

testing::InitGoogleTest(&argc, argv);

调用测试样例

RUN_ALL_TESTS();

TEST

//这里不需要双引号,且同测试下多个测试样例不能同名
TEST(test_fixture,test_name)
TEST_F(test_fixture,test_name)
  • TEST:主要用来创建一个简单测试, 它定义了一个测试函数, 在这个函数中可以使用任何 C++代码并且使用框架提供的断言进行检查。
  • TEST_F:主要用来进行多样测试,适用于多个测试场景如果需要相同的数据配置的情况, 即相同的数据测不同的行为。

断言宏

GTest 中的断言的宏可以分为两类:
  • ASSERT_系列:如果当前点检测失败则退出当前函数。
  • EXPECT_系列:如果当前点检测失败则继续往下执行。
下面是经常使用的断言介绍
// bool 值检查
ASSERT_TRUE(参数),期待结果是 true
ASSERT_FALSE(参数),期待结果是 false
//数值型数据检查
ASSERT_EQ(参数 1,参数 2),传入的是需要比较的两个数 equal
ASSERT_NE(参数 1,参数 2),not equal,不等于才返回 true
ASSERT_LT(参数 1,参数 2),less than,小于才返回 true
ASSERT_GT(参数 1,参数 2),greater than,大于才返回 true
ASSERT_LE(参数 1,参数 2),less equal,小于等于才返回 true
ASSERT_GE(参数 1,参数 2),greater equal,大于等于才返回 true

样例

main.cc

#include <iostream>
#include <gtest/gtest.h>
using namespace std;
int Add(int x, int y)
{return x + y;
}
TEST(testadd, test1)
{ASSERT_EQ(Add(10, 20), 30);
}
TEST(testadd, test2)
{ASSERT_LT(Add(10, 20), 40);ASSERT_GT(Add(10, 20), 40);
}
int main(int argc, char *argv[])
{// 将命令行参数传递给 gtesttesting::InitGoogleTest(&argc, argv);// 运行所有测试案例return RUN_ALL_TESTS();
}

makefile

main:main.ccg++ -o $@ $^ -std=c++17 -lgtest

编译后运行可以看到如下测试信息。

事件机制

GTest 中的事件机制是指在测试前和测试后提供给用户自行添加操作的机制,而且该 机制也可以让同一测试套件下的测试用例共享数据。 GTest 框架中事件的结构层次:
  • 测试程序:一个测试程序只有一个 main 函数,也可以说是一个可执行程序是一个测试程序,该级别的事件机制是在程序的开始和结束执行。
  • 测试套件:代表一个测试用例的集合体,该级别的事件机制是在整体的测试案例开始和结束执行。
  • 测试用例:该级别的事件机制是在每个测试用例开始和结束都执行。
事件机制的最大好处就是能够为我们各个测试用例提前准备好测试环境,并在测试完毕后用于销毁环境,这样有个好处就是如果我们有一端代码需要进行多种不同方法的测试,则可以通过测试机制在每个测试用例进行之前初始化测试环境和数据,并在测试完毕后清理测试造成的影响。GTest 提供了三种常见的的事件:

全局事件

针对整个测试程序。实现全局的事件机制,需要创建一个类,然后继承 testing::Environment 类,然后分别实现成员函数 SetUp 和 TearDown,同时在 main 函数内进行调用如下函数添加全局的事件机制。
testing::AddGlobalTestEnvironment(new MyEnvironment); 

示例:

#include <iostream>
#include <gtest/gtest.h>
// 全局事件:针对整个测试程序,提供全局事件机制,能够在测试之前配置测试环境数据, 测试完毕后清理数据
// 先定义环境类,通过继承 testing::Environment 的派生类来完成
// 重写的虚函数接口 SetUp 会在测试之前被调用; TearDown 会在测试完毕后调用.
std::unordered_map<std::string, std::string> dict;
class HashTestEnv : public testing::Environment
{
public:virtual void SetUp() override{std::cout << "测试前:提前准备数据!!\n";dict.insert(std::make_pair("Hello", "你好"));dict.insert(std::make_pair("雷吼", "你好"));}virtual void TearDown() override{std::cout << "测试结束后:清理数据!!\n";dict.clear();}
};
TEST(hash_case_test, find_test)
{auto it = dict.find("Hello");ASSERT_NE(it, dict.end());
}
TEST(hash_case_test, size_test)
{ASSERT_GT(dict.size(), 0);
}
int main(int argc, char *argv[])
{testing::AddGlobalTestEnvironment(new HashTestEnv);testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

TestSuite 事件

针对一个个测试套件。测试套件的事件机制我们同样需要去创建一个类,继承自 testing::Test,实现两个静态函数 SetUpTestCase TearDownTestCase ,测试套件的事件机制不需要像全局事件机制一样在 main 注册,而是需要将我们平时使用的 TEST 宏改为 TEST_F 宏。
  • SetUpTestCase() 函数是在测试套件第一个测试用例开始前执行
  • TearDownTestCase() 函数是在测试套件最后一个测试用例结束后执行
  • 需要注意 TEST_F 的第一个参数是我们创建的类名,也就是当前测试套件的名称,这样在 TEST_F 宏的测试套件中就可以访问类中的成员了
#include <iostream>
#include <gtest/gtest.h>
// TestSuite:测试套件/集合进行单元测试,即,将多个相关测试归入一组的方式进行测试, 为这组测试用例进行环境配置和清理
// 概念: 对一个功能的验证往往需要很多测试用例,测试套件就是针对一组相关测试用例进行环境配置的事件机制
// 用法: 先定义环境类,继承于 testing::Test 基类, 重写两个静态函数 SetUpTestCase / TearDownTestCase 进行环境的配置和清理
class HashTestEnv1 : public testing::Test
{
public:static void SetUpTestCase(){std::cout << "环境 1 第一个 TEST 之前调用\n";}static void TearDownTestCase(){std::cout << "环境 1 最后一个 TEST 之后调用\n";}
public:std::unordered_map<std::string, std::string> dict;
};
// 注意,测试套件使用的不是 TEST 了,而是 TEST_F, 而第一个参数名称就是测试套件环境类名称
// main 函数中不需要再注册环境了,而是在 TEST_F 中可以直接访问类的成员变量和成员函数
TEST_F(HashTestEnv1, insert_test)
{std::cout << "环境 1,中间 insert 测试\n";dict.insert(std::make_pair("Hello", "你好"));dict.insert(std::make_pair("雷吼", "你好"));auto it = dict.find("Hello");ASSERT_NE(it, dict.end());
}
TEST_F(HashTestEnv1, sizeof)
{std::cout << "环境 1,中间 size 测试\n";ASSERT_GT(dict.size(), 0);
}
int main(int argc, char *argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
能够看到在上例中,有一个好处,就是将数据与测试结合到同一个测试环境类中了,这样与外界的耦合度更低,代码也更清晰。
但是同样的,我们发现在两个测试用例中第二个测试用例失败了,这是为什么呢? 这就涉及到了 TestCase 事件的机制。

TestCase 事件

针对一个个测试用例。测试用例的事件机制的创建和测试套件的基本一样,不同地方在于测试用例实现的两个函数分别是 SetUp TearDown , 这两个函数也不是静态函数:
  • SetUp()函数是在一个测试用例的开始前执行
  • TearDown()函数是在一个测试用例的结束后执行
也就是说,在 TestSuite/TestCase 事件中,每个测试用例,虽然它们同用同一个事件环境类,可以访问其中的资源,但是本质上每个测试用例的环境都是独立的,这样我们就不用担心不同的测试用例之间会有数据上的影响了,保证所有的测试用例都使用相同的测试环境进行测试。而 TestCase 事件中还实现 SetUp 和 TearDown两个函数,这两个函数会在每一个测试函数调用前都会调用一遍,这样能实现每个测试函数执行时环境的一致性。
#include <iostream>
#include <gtest/gtest.h>
// TestCase:测试用例的单元测试,即针对每一个测试用例都使用独立的测试环境数据进行测试
// 概念:它是针对测试用例进行环境配置的一种事件机制
// 用法:先定义环境类,继承于 testing::Test 基类, 在环境类内重写SetUp/TearDown 接口
class HashTestEnv2 : public testing::Test
{
public:static void SetUpTestCase(){std::cout << "环境 2 第一个 TEST 之前被调用,进行总体环境配置\n ";}static void TearDownTestCase(){std::cout << "环境 2 最后一个 TEST 之后被调用,进行总体环境清理\n ";}virtual void SetUp() override{std::cout << "环境 2 测试前:提前准备数据!!\n";dict.insert(std::make_pair("bye", "再见"));dict.insert(std::make_pair("see you", "再见"));}virtual void TearDown() override{std::cout << "环境 2 测试结束后:清理数据!!\n";dict.clear();}public:std::unordered_map<std::string, std::string> dict;
};
TEST_F(HashTestEnv2, insert_test)
{std::cout << "环境 2,中间测试\n";dict.insert(std::make_pair("hello", "你好"));ASSERT_EQ(dict.size(), 3);
}
TEST_F(HashTestEnv2, size_test)
{std::cout << "环境 2,中间 size 测试\n";auto it = dict.find("hello");ASSERT_EQ(it, dict.end());ASSERT_EQ(dict.size(), 2);
}
int main(int argc, char *argv[])
{testing::InitGoogleTest(&argc, argv);RUN_ALL_TESTS();return 0;
}


文章转载自:

http://lUfqIB8V.wmgLg.cn
http://3R3UXGHP.wmgLg.cn
http://ZugEAZE2.wmgLg.cn
http://KEnVUSme.wmgLg.cn
http://Chk8fgKd.wmgLg.cn
http://Q9ryVhyG.wmgLg.cn
http://UZPwjoJo.wmgLg.cn
http://Tb8XYosf.wmgLg.cn
http://gIPNiKcl.wmgLg.cn
http://Kdae0HIq.wmgLg.cn
http://muxdwozJ.wmgLg.cn
http://8vTL9DgZ.wmgLg.cn
http://DbiorBSf.wmgLg.cn
http://myICWydj.wmgLg.cn
http://jYSS8cg6.wmgLg.cn
http://mVMTMuxO.wmgLg.cn
http://O24KeoLJ.wmgLg.cn
http://hQkxytZy.wmgLg.cn
http://a4eoHps8.wmgLg.cn
http://7PvRfjyf.wmgLg.cn
http://yMHWQXD2.wmgLg.cn
http://HIBxaG21.wmgLg.cn
http://57M8Hk6k.wmgLg.cn
http://dMSJKTnr.wmgLg.cn
http://5p0uNpPg.wmgLg.cn
http://MIh38gwl.wmgLg.cn
http://Ib8QMD0y.wmgLg.cn
http://UNECf2SZ.wmgLg.cn
http://BdY6ApzI.wmgLg.cn
http://LRgFlWnP.wmgLg.cn
http://www.dtcms.com/wzjs/694534.html

相关文章:

  • 高端品牌网站建设公司企业网站建设存在的问题及建议
  • 营销型网站建设个人软文推广的标准类型
  • 宜城营销型网站套餐电子商务网站开发 pdf
  • 知名企业网站人才招聘情况如何搭建网站挣钱
  • 网站建设员招聘自动化产品的网站建设
  • 海南第四建设工程有限公司网站淘宝api wordpress
  • 帮人家做家务的网站廊坊seo推广
  • xxx网站建设规划坪山住房和建设局网站
  • 门户类网站图片外贸网站外贸网站建设行吗
  • 做淘宝店招的网站北京最新防疫信息
  • 做网站建立数据库公司建设网站重要性
  • 万网做网站花多少钱crm客户管理系统软件
  • 官网站超链接怎么做中国香烟网上商城
  • 深圳网站关键词优化公司哪家好如何为企业进行营销策划
  • php网站开发参考文献继续接入备案 增加网站 区别
  • 网站设置为应用程序怎么在自己网站上做拼图
  • html网页制作个人网站wordpress页面加载时间
  • 服务器做ssr后还可以做网站吗福田庆三整过的明星
  • 标准论坛网站建设做电影网站配什么公众号
  • 电子商务网站上线活动策划网上可以注册公司吗?都需要什么
  • 做设计必须知道的几个网站用仿站工具做网站
  • 廊坊网站制作建设留言板网站模板
  • 创立一个网站要多少钱电子商务网站规划与建设
  • 网站后台传不上图片国内有名的软件开发公司排名
  • 天津制作网站公司推荐山东通信局报备网站
  • 北京南站是中高风险地区吗刷单网站开发
  • 怎么开一个网站平台抖音开放平台官网入口
  • 微信商城网站建设多少钱logo生成器免费版
  • 常州建网站公司门户网站 架构
  • 长沙做网站 青创互联微盟商户助手官网