go语言网站开发教程,大学生网站作业,网站开发参考文献格式,企业邮箱怎么注册自己的账号目录 编译和安装框架使用AssertionsGoogle TestingGoogle MockingMatchersActions 运行结果 最近在写项目的时候#xff0c;学到了许多关于软件测试的知识#xff0c;也不断的使用新的测试框架和测试工具#xff0c;每次总是机械式的拼接其他人的代码#xff0c;代码发生错… 目录 编译和安装框架使用AssertionsGoogle TestingGoogle MockingMatchersActions 运行结果 最近在写项目的时候学到了许多关于软件测试的知识也不断的使用新的测试框架和测试工具每次总是机械式的拼接其他人的代码代码发生错误也不知道怎么解决因此我打算直接将其学一遍以便为了更灵活的写测试代码 编译和安装
下载地址Google Test Github网站
然后直接在CMakeLists.txt引入就好了
include_directories(include) # 设置include路径set(CXXFLAGS -stdc11 -lgtest -lpthread)
add_compile_options(${CXXFLAGS})target_link_libraries(test gtest pthread) # 链接gtest静态库框架使用
框架的使用主要分为几个模块Assertions、Google Testing、Google Mocking、Matchers、Actions
Assertions
这一部分主要是一些断言和比较宏定义内容较多以下是一部分想看全部的可以去看源码
这一部分理解比较简单不做概述
#define EXPECT_THROW(statement, expected_exception) \GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
#define EXPECT_NO_THROW(statement) \GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
#define EXPECT_ANY_THROW(statement) \GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
#define ASSERT_THROW(statement, expected_exception) \GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
#define ASSERT_NO_THROW(statement) \GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
#define ASSERT_ANY_THROW(statement) \GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)Google Testing
这部分是框架的主要部分也是开发人员接触最多的地方
首先来介绍三个常用的宏TEST、TEST_F、TEST_P
TEST一般测试在其内部设置断言 TestSuiteName定义了测试套件名称TestName定义了自定义测试名 注意这两个的命名不要包括下划线_ TEST(TestSuiteName, TestName)
{// statements
}TEST_F多样测试就是多种不同情况的测试中都会使用相同一份的测试数据的情况
TEST_P(TestFixtureName, TestName)
{// statements
}TEST_P值参数化测试自动化产生输入参数进行测试
TEST_P(TestFixtureName, TestName)
{// statements
}以TEST_P为例写一个小demo
首先定义一个测试套件类在其中定义要产生测试输入参数的类型
// 其中TestWithParam从Test类和WithParamInterface类派生来的这两个类是必要的
class FooTest : public ::testing::TestWithParamint {};产生自动化输入参数结构
INSTANTIATE_TEST_CASE_P(InstantiationName, // 此处自定义名称FooTest, // 测试套件类::testing::Values(1, 2, 3));第三个参数是可更改的比如Range、Bool、ValuesIn、Values
INSTANTIATE_TEST_SUITE_P(MyInstantiation, MyTestSuite,testing::Values(...),[](const testing::TestParamInfoMyTestSuite::ParamType info) {// Can use info.param here to generate the test suffixstd::string name ...return name;});要注意的是Combine它会把其中的变量组成一个联合排列输入参数确保支持tr/tupleT特性 class Bis {bool Even(int dd) {}bool Suc(bool dc) {}
};class CombineTest : public ::testing::TestWithParam ::testing::tuplebool, int {
protected:bool CheckData() {bool dc ::testing::get0(GetParam());int dd ::testing::get1(GetParam());return bis.Suc(dc) bis.Even(dd);}
private:Bis bis;
}TEST_P(MyCombineTest, CombineTestUnit)
{EXPECT_TRUE(CheckData());
}INSTANTIATE_TEST_CASE_P(TestBisValuesCombine, CombineTest, ::testing::Combine(::testing::Bool(), ::testing::Values(3, 4)));最后在TEST_P中写测试代码
bool IsPrime(int n)
{return n 0;
}TEST_P(FooTest, DoesBlah)
{// Inside a test, access the test parameter with the GetParam() method// of the TestWithParamT class://在测试中使用TestWithParam T类的GetParam方法访问测试参数int n GetParam();EXPECT_TRUE(IsPrime(n));// ...
}其他部分API用的时候直接看官网就好了主体是这三个API其他基本上都是辅助宏
Google Mocking
有点类似于伪装接口一般情况下用不着不做概述
Matchers
有点类似于前面的断言直接看部分源码在gmok-matchers.h文件中
inline PolymorphicMatcherinternal::StrEqualityMatcherstd::wstring StrEq(const std::wstring str) {return MakePolymorphicMatcher(internal::StrEqualityMatcherstd::wstring(str, true, true));
}// Matches a string not equal to str.
inline PolymorphicMatcherinternal::StrEqualityMatcherstd::wstring StrNe(const std::wstring str) {return MakePolymorphicMatcher(internal::StrEqualityMatcherstd::wstring(str, false, true));
}// Matches a string equal to str, ignoring case.
inline PolymorphicMatcherinternal::StrEqualityMatcherstd::wstring StrCaseEq(const std::wstring str) {return MakePolymorphicMatcher(internal::StrEqualityMatcherstd::wstring(str, true, false));
}Actions
这玩意也是一个和断言差不多的东西看部分源码
template size_t k, typename Ptr
struct SaveArgAction {Ptr pointer;template typename... Argsvoid operator()(const Args... args) const {*pointer std::getk(std::tie(args...));}
};template size_t k, typename Ptr
struct SaveArgPointeeAction {Ptr pointer;template typename... Argsvoid operator()(const Args... args) const {*pointer *std::getk(std::tie(args...));}
};运行结果
下面来看看一个普通测试套件的运行结果
#include gtest/gtest.h
#include stdint.h
#include stdio.hint Add(uint32_t a, uint32_t b)
{return a b;
}TEST(LLT, MAIN)
{EXPECT_EQ(Add(1U, 1U), 1U);
}int main(int argc, char **argv)
{testing::InitGoogleTest(argc, argv);return RUN_ALL_TESTS();
}ubuntuVM-8-16-ubuntu:~/finale/llt/build$ ./test
[] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from LLT
[ RUN ] LLT.MAIN
/home/ubuntu/finale/llt/src/test_main.cc:17: Failure
Expected equality of these values:add(1U, 1U)Which is: 21UWhich is: 1
[ FAILED ] LLT.MAIN (0 ms)
[----------] 1 test from LLT (0 ms total)[----------] Global test environment tear-down
[] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 0 tests.
[ FAILED ] 1 test, listed below:
[ FAILED ] LLT.MAIN1 FAILED TEST这个框架自定义的界面还是很好看的