版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/Tosonw/article/details/89449029
一、Catch簡(jiǎn)介
Catch是一個(gè)很時(shí)尚的,C++原生的框架,只包含一個(gè)頭文件,用于單元測(cè)試,TDD測(cè)試驅(qū)動(dòng)開(kāi)發(fā)和BDD行為驅(qū)動(dòng)開(kāi)發(fā)。
在catch的文檔指出,對(duì)于C++單元測(cè)試框架,目前已經(jīng)有 Google Test, Boost.Test, CppUnit, Cute, 以及其它的一些,相比較之下catch簡(jiǎn)單易用、不依賴外部庫(kù)、支持BDD、測(cè)試命名自由等優(yōu)勢(shì)。
Catch是一個(gè)header-only的開(kāi)源庫(kù),這意味著你只需要把一個(gè)頭文件放到系統(tǒng)或者你的工程的某個(gè)目錄,編譯的時(shí)候指向它就可以了。
二、Catch使用
頭文件
github地址:https://github.com/philsquared/Catch
$ git clone https://github.com/philsquared/Catch.git
???
可以在github直接下載catch.hpp文件,引入到自己的c++工程中。
#include
???
使用
TEST_CASE() {
??? REQUIRE(2 == 2);
}
當(dāng)然也可以為TEST_CASE起名字,或者加標(biāo)簽:
// test case的名字,全局必須唯一
// "tag1"是標(biāo)簽名,需要放在[]內(nèi)部。一個(gè)test case可以有多個(gè)標(biāo)簽,多個(gè)test case可以使用相同的標(biāo)簽。
TEST_CASE("Test_name", "[tag1]") {
??? REQUIRE(2 == 2); //REQUIRE是一個(gè)assert宏,用來(lái)判斷是否相等。
}
官網(wǎng)用例:
#define CATCH_CONFIG_MAIN? // This tells Catch to provide a main() - only do this in one cpp file
#include "catch.hpp"
unsigned int Factorial( unsigned int number ) {
??? return number <= 1 ? number : Factorial(number-1)*number;
}
TEST_CASE( "Factorials are computed", "[factorial]" ) {
??? REQUIRE( Factorial(1) == 1 );
??? REQUIRE( Factorial(2) == 2 );
??? REQUIRE( Factorial(3) == 6 );
??? REQUIRE( Factorial(10) == 3628800 );
}
三、基本斷言
REQUIRE(expression)
CHECK(expression)
REQUIRE_FALSE(expression)
CHECK_FALSE(expression)
注意:REQUIRE和CHECK最主要的區(qū)別在于REQUIRE表達(dá)式為false時(shí)中斷執(zhí)行,而CHECK繼續(xù)執(zhí)行。
Matcher比較器
REQUIRE_THAT(lhs, matcher expression)
CHECK_THAT(lhs, matcher expression)
主要內(nèi)置Matchers
– string matchers:StartsWith, EndsWith, Contains, Equals and Matches
– vector matchers:Contains, VectorContains and Equals
– floating point matchers:WithinULP and WithinAbs
REQUIRE_THAT( str, EndsWith( "as a service", Catch::CaseSensitive::No ) );
???
浮點(diǎn)數(shù)比較
//浮點(diǎn)數(shù)比較:
//??? epsilon:default std::numeric_limits::epsilon()*100.
//??? margin:default 0.0.
//??? scale:default 0.0.
TEST_CASE("approx epsilon", "[single-file]")
{
??? // 閉區(qū)間
??? // [100-100*epsilon,100+100*epsilon]
??? Approx target = Approx(100).epsilon(0.01);
??? CHECK(100.0 == target); // Obviously true
??? CHECK(99.0 == target); // Obviously true
//??? CHECK_FALSE(98.1 == target); // Obviously true
??? CHECK_FALSE(98.1 == target); // Obviously true
??? CHECK(101.0 == target); // Obviously true
//??? CHECK_FALSE(101.1 == target); // Obviously true
??? CHECK_FALSE(101.1 == target); // Obviously true
}
TEST_CASE("approx margin", "[single-file]")
{
??? // 閉區(qū)間
??? // [100-margin,100+margin]
??? Approx target = Approx(100).margin(1);
??? CHECK(100.0 == target); // Obviously true
??? CHECK(99.0 == target); // Obviously true
??? CHECK_FALSE(98.1 == target); // Obviously true
??? CHECK(101.0 == target); // Obviously true
??? CHECK_FALSE(101.1 == target); // Obviously true
}
信息輸出:Logging
??? INFO( message expression )
??? WARN( message expression )
??? FAIL( message expression )
??? FAIL_CHECK( message expression )
??? CAPTURE( expression1, expression2, … )
四、命令行參數(shù) - TAG
Catch 提供的這個(gè) main 函數(shù)實(shí)現(xiàn)的另一個(gè)強(qiáng)大的功能是豐富的命令行參數(shù),你可以選擇執(zhí)行其中的某些 TEST_CASE,也可以選擇不執(zhí)行其中的某些 TEST_CASE,你可以用它調(diào)整輸出到 xml 文件,也可以用它從文件中讀取需要測(cè)試的用例。
需要注意的是,這些強(qiáng)大的命令行大多數(shù)是基于 TAG 的,也就是 TEST_CASE 定義中的第二個(gè)參數(shù)。
TEST_CASE( "vectors can be sized and resized", "[vector]" )
???
上面的定義中 “[vector]” 就是一個(gè) TAG,你可以提供多個(gè) TAG:
TEST_CASE( "D", "[widget][gadget]" ) { /* ... */ }
???
這樣的話你可以在命令行中根據(jù) TAG 去選擇是否需要執(zhí)行該 TEST_CASE。比如:
./catch "[vector]" // 只執(zhí)行那些標(biāo)記為 vector 的測(cè)試用例
???
此外你還可以使用一些特殊的字符,比如 [.] 表示隱藏。[.integration] 則表示默認(rèn)隱藏,但是可以在命令行中使用 [.integration] 這個(gè) TAG 執(zhí)行。
./catch // 默認(rèn)不執(zhí)行 integration
./catch "[.integration]" // 使用 TAG 執(zhí)行 integration
例:
$ shtf_sdk_interface_catchtest_ [FaceExtractFeature] -c ErrordataTest --use-colour yes -r xml -d yes --order lex
五、我自己學(xué)習(xí)的時(shí)候?qū)懙睦蹋?br />
ps:含有豐富的注釋,以供理解學(xué)習(xí)。
//
// Created by toson on 19-3-13.
//
// This file is a sample file.
//
#include
#include
#include
評(píng)論
查看更多