APR中的單元測試框架 深入分析內部實現

2021-08-30 09:46:49 字數 1792 閱讀 1566

apr單元測試框架實現的實在簡單,除了斷言集之外abts只向外部暴露了兩個介面:

abts_suite *abts_add_suite(abts_suite *suite, const char *suite_name_full);

void abts_run_test(abts_suite *ts, test_func f, void *value);

#define add_suite(suite) abts_add_suite(suite, __file__);

我們暫時不看函式的實現,先看看幾個核心的資料結構。

struct sub_suite ;

sub_suite對應於對乙個模組測試的的測試用例集合,他包含測試的一些統計資訊,方便以後生成測試報告。

struct abts_suite ;

這算是所有sub_suite的根了,我們是在它的基礎上構建sub_suite鍊錶的。根據它我們可以找到我們最關心的兩個suite。head指向第 乙個suite,可以方便我們定位整個鍊錶、tail指向最後乙個suite,其實定位的是我們當前正在測試的suite。

struct abts_case ;

表示乙個測試用例,它不會儲存在鍊錶中。被斷言集使用,記錄斷言是否失敗。

令人驚嘆的是,你在使用這個框架是我們幾乎不用關心這3個資料結構,只需要機械的使用add_suite和abts_run_test 就好了。

下面我們來看看兩個主要函式。

1. abts_add_suite

/* only end the suite if we actually ran it */

if (suite && suite->tail &&!suite->tail->not_run)

怎麼函式剛一開始就要結束掉suite?(end_suite其實是列印suite是否通過測試)仔細分析後才知道,這一句不是要結束自己,而是要結束上乙個suite。再回過頭來看看主函式中的**就會明白了。

abts_suite* suite = null;

for (i = 0; i < (sizeof(alltests) / sizeof(struct testlist *)); i++)

讓我們一步步的分析:

1. 開始suite = null; 第一次當然就不會執行end_suite了,因為這時根本沒有前乙個suite可以結束掉。

2. 第二次進入迴圈時,就會呼叫end_suite了,因為這是suite是第一次執行測試後的返回值,suite != null。

3. 依次類推可以得出end_suite實際上是列印前乙個測試的結果。這種設計比較的精巧。

再往下看**,

建立乙個subsuite,給這個suite乙個名字,這個名字是suite所在的檔案的檔名去掉字尾。然後再將其加入到鍊錶中。

2. abts_run_test

這個函式就是呼叫具體的測試用例函式。測試用例函式是對乙個基本功能的測試,它主要使用斷言集。

首先取最後乙個suite

ss = ts->tail;

即當前正在測試的suite。

然後初始化test_case。並將suite中的測試用例數遞增。

tc.failed = 0;

tc.suite = ss;

ss->num_test++;

最後呼叫實際的測試用例函式,將用例是否失敗的資訊放入到tc中。更新suite的測試用例失敗數。

f(&tc, value);

if (tc.failed)

很簡單,我在這裡分析好像是沒必要的了。我感嘆寫abts作者的智慧型。

單元測試框架的選擇

今天給大家介紹單元測試的概念,以python語言為基礎,帶你了解如何選擇單元測試框架。單元測試是指,對軟體中的最小可測試單元在與程式其他部分相隔離的情況下進行檢查和驗證的工作,這裡的最小可測試單元通常是指函式或者類。從 基礎元件 開測,單元測試物件是 以函式或類為單位,完成基礎測試,在 封裝成 功能...

基於Unittest的單元測試 框架

htmltestrunner.py 檔案請移步這裡 用例可以在setup和teardown裡面自己寫 匯入 unittest 包 import unittest 建立類,繼承 unittest.testcase 用例執行前的操作 defsetup self pass 用例方法 所有的用例必須是tes...

Spring框架下的單元測試

一 使用spring中對junit框架的整合功能 除了junit4和spring的jar包,還需要spring test.jar。引入如下依賴 dependency groupid junit groupid artifactid junit artifactid version 4.10 vers...