VS2017 C++ Catch单元测试-实例 tcy

网上很多资源大都原文档的翻译,具体怎么做我没有找到更好的实例,于是自己写一个函数及类的基本测试步骤。
本着使用,理论不讲。基本的注意事项我在程序中有注释。我用catch的原因是方便,不用设置VS,代码容易理解,简单易上手,对于ATL的调试比较复杂,在此没有涉及。
原文档很多讲在控制台下的调试(参考我的上一篇博文)我觉得用途不是太大,且需要一些时间学习。按照本测试方式你能马上上手,仅仅需要包含头文件TEST_MAIN.h就可以。
原因吗你慢慢研究吧!原代码下载 https://download.csdn.net/download/tcy23456/16660876

 

//TEST_MAIN.h#pragma once
/********************************************************
用途:Test Main()入口函数
时间:2021/4/13 tcy shanghai songjiang xiaokunshan V1.0
********************************************************/#include //捕获变量或表达式的值
#define print_variable(v,...) CAPTURE(v, ## __VA_ARGS__ )//自定义测试函数:
//void assert_(int x1, int x2);
#define assert_(x1, x2)  CHECK((x1) == (x2))         //错误不退出
#define assert_Require(x1, x2)  REQUIRE((x1) == (x2))//错误退出//显示函数:
void print(const std::string& str);
void print(const char*str);
//TEST_MAIN.cpp/**********************************************************************
用途:Test Main()测试程序入口;每个方案只能有一个
时间:2021-4-13 tcy shanghai songjiang xiaokunshan
说明: catch测试仅需要包含头文件,不需要配置设置,不需要main()直接使用注意:1)下面可写函数或测试代码,但不建议;可定义测试类的公共函数2)你应编写专用的测试代码文件,仅仅在头部添加:#include "TEST_MAIN.h"3) 测试程序不能包含int main(){}4) 若定义函数必须在xxx.h声明(声明定义错误)在xxx.cpp定义**********************************************************************/#define CATCH_CONFIG_MAIN  //Test Main()测试程序入口;每个方案只能有一个
#include "TEST_MAIN.h"/**********************************************************************
自定义测试函数:
说明:这样定义无问题,能正常使用。
缺点:若抛出异常会定位在函数中,不方便定位在调用程序查找错误点
改善:用宏定义替代函数定义
**********************************************************************/
//void assert_(int x1, int x2) { CHECK((x1) == (x2)); }//显示函数:
void print(const std::string& str) {/*1)测试正常不会显示消失(控制台模式可以)2)要想显示消息必须在测试程序TEST_CASE()尾部添加CHECK(false);*/UNSCOPED_INFO(str);//INFO("测试开始...");
}void print(const char*str) {UNSCOPED_INFO(std::string(str));
}
Func.h#pragma onceint add_(int a, int b);
int sub_(int a, int b);
int mul_(int a, int b);
int div_(int a, int b);int div1(int x, int y);
int div2(int x, int y);
Func.cpp
#include "Func.h"int add_(int a, int b) { return a + b; }
int sub_(int a, int b) { return a - b; }
int mul_(int a, int b) { return a * b; }
int div_(int a, int b) { return a / b; }int div1(int x, int y) { return x / y; }
int div2(int x, int y) { if (y == 0) throw "error y=0"; return x / y; }
BoyClass.h
#pragma once
#include //int add(int x,int y);
//int sub(int x,int y);class BoyClass
{
public:void set_name(std::string name) { this->name = name; }void set_age(int age) { this->age = age; }std::string get_name() { return name; }int get_age() { return age; }
private:std::string name = "";int age = 0;
};
testBase.cpp
#include "BoyClass.h"          //包含要测试的类函数
#include "Func.h"
#include "TEST_MAIN.h"TEST_CASE("测试CHECK REQUIRE") {INFO("1.1.CHECK测试开始...");CHECK(1);INFO("1.2.CHECK(1)完成 Test=ok.");CHECK(0);INFO("1.3.CHECK(0)完成 Test = ng.");CHECK(1);INFO("2.1.REQUIRE测试开始...");REQUIRE(1);INFO("2.2.REQUIRE(1)完成 Test=ok.");REQUIRE(0);INFO("2.3.REQUIRE(0)完成fail.下面测试不执行,不显示本条消息.进入下一个测试test add1");REQUIRE(1);
}
/*1.1.CHECK测试开始...1.2.CHECK(1)完成 Test=ok.1.3.CHECK(0)完成 Test = ng.2.1.REQUIRE测试开始...2.2.REQUIRE(1)完成 Test=ok.
*/TEST_CASE("测试THROW:", "[arg_throw]") {CHECK_NOTHROW((1 / 2));CHECK_THROWS(div2(1, 0));//ok.确实抛出啦异常CHECK_THROWS(div2(1, 1));//ng.程序没有抛出异常REQUIRE_THROWS_WITH(div2(1, 0), "error y=0");
}TEST_CASE("测试float:", "[arg_float]") {using namespace Catch::literals;//默认最多5位小数点精度CHECK(3.14156 == Approx(3.1415926535898));//trueCHECK(3.14155 == Approx(3.1415926535898));//false//上面的简写CHECK(3.14156 == 3.1415926535898_a);      //trueCHECK(3.14155 == 3.1415926535898_a);      //false//最多+-1%偏差CHECK(101 == Approx(100).epsilon(0.01));  //trueCHECK(99 == Approx(100).epsilon(0.01));   //true//最多+-2偏差CHECK(98 == Approx(100).margin(2));       //trueCHECK(102 == Approx(100).margin(2));      //true
}TEST_CASE("测试显示消息:", "[arg_msg]") {assert_(1, 1);//okassert_(1, 2);//ngprint("start test...");for (int i = 0; i < 3; ++i)UNSCOPED_INFO("数字 i=" << (i + 1));Approx v = Approx(3.1415926535898);auto err_msg=Catch::Message("pi = " + v.toString());print("err_msg=" + err_msg.toString()+'\n');print("err_msg=" + err_msg.describe() + '\n');INFO("准备捕获变量或表达式的值:");int a = 1, b = 2, c = 3;CAPTURE(a, b, c, a + b, c > b, a == 1);CAPTURE((std::pair{1, 2}));//快速捕获变量或表达式的值CHECK(false);//必须false否则不会显示消息
}/*start test...数字 i=1数字 i=2数字 i=3err_msg=exception message matches "pi = Approx( 3.1415926536 )"err_msg=exception message matches "pi = Approx( 3.1415926536 )"准备捕获变量或表达式的值:a := 1b := 2c := 3a + b := 3c > b := truea == 1 := true(std::pair{1, 2}) := {?}
*/

 

testFunc.cpp#include "Func.h"              //包含要测试的函数
#include "TEST_MAIN.h"         //测试MAIN()入口/*
此处可以定义要测试的函数或类:不建议
int add(int a, int b) { return a + b; }
*/TEST_CASE("测试Func_add sub mul", "[arg_add],[arg_sub],[arg_mul]") {int a = 1, b = 2;SECTION("a = 1, b = 2", "[add()==3]") { REQUIRE(add_(a,b) == 3);}SECTION("a = 1, b = 2", "[sub()==3]") { REQUIRE(sub_(a, b) == -1); }SECTION("a = 1, b = 2", "[mul()==3]") { REQUIRE(mul_(a, b) == 2); }SECTION("a = 1, b = 2", "[add()==3]") { REQUIRE(add_(a, b) == 4); }
}TEST_CASE("测试Func_div", "[arg_div]") {int a = 10, b = 2;REQUIRE(b != 0);SECTION("a = 10, b = 2", "[div()==3]") { REQUIRE(div_(a, b) == 5); }SECTION("a = 10, b = 0", "[div()==3]") { REQUIRE(div_(a, b) == 5); }//循环测试:for (int i = -3; i < 3; ++i) {//SECTION(std::string("Looped section: i=") + i)DYNAMIC_SECTION("Looped section: i= " << i) {REQUIRE(i!=0);REQUIRE(div_(a, i) == a/i);}}	
}
testBoyClass.cpp
#include "BoyClass.h"          //包含要测试的类函数
#include "TEST_MAIN.h"         //测试MAIN()入口/*
此处可以定义要测试的函数或类:不建议
int add(int a, int b) { return a + b; }
*/TEST_CASE("测试BoyClass", "[arg_method]") {INFO("1.测试BoyClass_1测试开始...");BoyClass b;std::string name = "Tom";int age = 22;REQUIRE(!name.empty());REQUIRE(age>0);SECTION("name=Bob", "[get_name()=='Bob']") { name = "Bob"; REQUIRE(!name.empty());b.set_name(name);REQUIRE(b.get_name() == name);}SECTION("age=30", "[get_age()==30]") {age = 30; REQUIRE(age>0);b.set_age(age); REQUIRE(b.get_age() == age);}SECTION("age=40", "[get_age()==40]") {age = 40; REQUIRE(age > 0);b.set_age(age); REQUIRE(b.get_age() == age+1);}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tcy_Project.exe is a Catch v2.13.4 host application.
Run with -? for options-------------------------------------------------------------------------------
测试CHECK REQUIRE
-------------------------------------------------------------------------------
c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(6)
...............................................................................c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(10): FAILED:CHECK( 0 )
with messages:1.1.CHECK测试开始...1.2.CHECK(1)完成 Test=ok.c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(17): FAILED:REQUIRE( 0 )
with messages:1.1.CHECK测试开始...1.2.CHECK(1)完成 Test=ok.1.3.CHECK(0)完成 Test = ng.2.1.REQUIRE测试开始...2.2.REQUIRE(1)完成 Test=ok.-------------------------------------------------------------------------------
测试THROW:
-------------------------------------------------------------------------------
c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(29)
...............................................................................c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(32): FAILED:CHECK_THROWS( div2(1, 1) )
because no exception was thrown where one was expected:-------------------------------------------------------------------------------
测试float:
-------------------------------------------------------------------------------
c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(36)
...............................................................................c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(41): FAILED:CHECK( 3.14155 == Approx(3.1415926535898) )
with expansion:3.14155 == Approx( 3.1415926536 )c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(45): FAILED:CHECK( 3.14155 == 3.1415926535898_a )
with expansion:3.14155 == Approx( 3.1415926536 )-------------------------------------------------------------------------------
测试显示消息:
-------------------------------------------------------------------------------
c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(57)
...............................................................................c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(59): FAILED:CHECK( (1) == (2) )
with expansion:1 == 2c:\users\administrator\source\repos\tcy_project\tcy_project\test_base.cpp(78): FAILED:CHECK( false )
with messages:start test...数字 i=1数字 i=2数字 i=3err_msg=exception message matches "pi = Approx( 3.1415926536 )"err_msg=exception message matches "pi = Approx( 3.1415926536 )"准备捕获变量或表达式的值:a := 1b := 2c := 3a + b := 3c > b := truea == 1 := true(std::pair{1, 2}) := {?}-------------------------------------------------------------------------------
测试Func_add sub mula = 1, b = 2
-------------------------------------------------------------------------------
c:\users\administrator\source\repos\tcy_project\tcy_project\test_func.cpp(12)
...............................................................................c:\users\administrator\source\repos\tcy_project\tcy_project\test_func.cpp(12): FAILED:REQUIRE( add_(a, b) == 4 )
with expansion:3 == 4-------------------------------------------------------------------------------
测试Func_divLooped section: i= 0
-------------------------------------------------------------------------------
c:\users\administrator\source\repos\tcy_project\tcy_project\test_func.cpp(29)
...............................................................................c:\users\administrator\source\repos\tcy_project\tcy_project\test_func.cpp(30): FAILED:REQUIRE( i!=0 )
with expansion:0 != 0-------------------------------------------------------------------------------
测试BoyClassage=40
-------------------------------------------------------------------------------
c:\users\administrator\source\repos\tcy_project\tcy_project\test_boyclass.cpp(24)
...............................................................................c:\users\administrator\source\repos\tcy_project\tcy_project\test_boyclass.cpp(26): FAILED:REQUIRE( b.get_age() == age+1 )
with expansion:40 == 41
with message:1.测试BoyClass_1测试开始...===============================================================================
test cases:  7 |  0 passed |  7 failed
assertions: 59 | 49 passed | 10 failedC:\Users\Administrator\source\repos\tcy_Project\x64\Debug\tcy_Project.exe (进程 4508)已退出,返回代码为: 10。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...*/

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部