Android系統中使用Cunit測試C/C++接口

Android系統中使用Cunit測試C/C++接口

Cunit是C/C++語言的單元測試框架,但常用于Windows和Linux開發中。

Android系統中經常有jni、so庫、hal service等都是C/C++實現,本文講解如何將Cunit嵌入Android中,用于測試一些C/C++ api。

Cunit簡介

Cunit是很早的C/C++接口測試框架,官網如下:

https://cunit.sourceforge.net/contact.html

測試模式有4種:

模式介紹
Basic最常用的,結果輸出到標準輸出(stdout)
Automated生成完XML文件之后,然后再將CUnit-List.dtd、CUnit-List.xsl、CUnit-Run.dtd、CUnit-Run.xsl(這幾個文件在CUnit的源碼包可以找到)和XML文件放到同一級目錄,再用IE瀏覽器打開,就可以看到漂亮的界面了。
Console比較靈活,可以選擇只執行其中某一個測試用例。
Curses跟Console類似,只不過是以Curses窗口的方式展示。
模式平臺結果輸出方式使用的接口函數
Basic所有標準輸出#include “CUnit/Basic.h”
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();
Automated所有xml文件#include “CUnit/Automated.h”
CU_list_tests_to_file();
CU_automated_run_tests();
Console所有交互式控制臺#include “CUnit/Console.h”
CU_console_run_tests();
CursesLinux/Unix交互式curses窗口#include “CUnit/CUCurses.h”
CU_curses_run_tests();

這4種模式最終的測試效果如下:
https://cunit.sourceforge.net/screenshots.html

模式測試結果呈現
Basichttps://cunit.sourceforge.net/ss_basic.html
Automatedhttps://cunit.sourceforge.net/ss_automated.html
Consolehttps://cunit.sourceforge.net/ss_console.html
Curseshttps://cunit.sourceforge.net/ss_curses.html

具體的使用文檔可以參考如下:

https://cunit.sourceforge.net/documentation.html

https://cunit.sourceforge.net/doc/index.html

中文文檔:

https://blog.csdn.net/iuices/article/details/115280751

測試demo:

https://cunit.sourceforge.net/example.html

源碼下載:

https://sourceforge.net/projects/cunit/

交流論壇:

https://sourceforge.net/p/cunit/discussion/

在Android中使用

編譯

libcunit_android庫的編譯文件Android.bp:

cc_library_shared {name: "libcunit_android",local_include_dirs: ["CUnit/Headers","CUnit/Sources/Test",],srcs: ["CUnit/Sources/Framework/TestRun.c","CUnit/Sources/Framework/TestDB.c","CUnit/Sources/Framework/Util.c","CUnit/Sources/Framework/CUError.c","CUnit/Sources/Framework/MyMem.c","CUnit/Sources/Console/Console.c","CUnit/Sources/Basic/Basic.c","CUnit/Sources/Test/test_cunit.c","CUnit/Sources/Automated/Automated.c",],cflags: ["-DMEMTRACE","-DCUNIT_BUILD_TESTS","-DCUNIT_DO_NOT_DEFINE_UNLESS_BUILDING_TESTS",],host_ldlibs: ["-llog"],
}cc_binary {name: "test_cunit_android",local_include_dirs: ["CUnit/Headers","CUnit/Sources/Test",],srcs: ["CUnit/Sources/Test/test_cunit.c"],cflags: ["-DCUNIT_BUILD_TESTS","-DCUNIT_DO_NOT_DEFINE_UNLESS_BUILDING_TESTS",],shared_libs: ["libcunit_android"],}

libcunit_android_test的編譯Android.bp

cc_binary {name: "libcunit_android_test",include_dirs: [".","./libcunit_android/CUnit/Headers/",],srcs: ["main.c","test.c","testcase.c",],shared_libs: ["libcunit_android"],}

如何調用框架

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "Basic.h"
#include "Automated.h"extern void AddTests(void);int main(int argc, char* argv[])
{CU_BasicRunMode mode = CU_BRM_VERBOSE;CU_ErrorAction error_action = CUEA_IGNORE;int i;//標準庫輸出 無緩沖:不使用緩沖。每個 I/O 操作都被即時寫入。buffer 和 size 參數被忽略。setvbuf(stdout, NULL, _IONBF, 0);for (i=1 ; i<argc ; i++) {if (!strcmp("-i", *argv)) {//錯誤發生時繼續執行(默認)error_action = CUEA_IGNORE;}else if (!strcmp("-f", *argv)) {//錯誤發生時應系統停止error_action = CUEA_FAIL;}else if (!strcmp("-A", *argv)) {//錯誤發生時系統應退出(EXIT)error_action = CUEA_ABORT;}else if (!strcmp("-s", *argv)) {//只會輸出錯誤信息mode = CU_BRM_SILENT;}else if (!strcmp("-n", *argv)) {//結果會輸出基本信息,包括失敗以及測試運行的總體狀況mode = CU_BRM_NORMAL;}else if (!strcmp("-v", *argv)) {//輸出測試運行的詳細信息mode = CU_BRM_VERBOSE;}else if (!strcmp("-e",*argv)) {return 0;}else {printf("\nUsage:BasicTest [options]\n\n""Options:-i ignore framework errors [default].\n"" -f fail on framework error.\n"" -A abort on framework error.\n\n"" -s silent mode - no output to screen.\n"" -n normal mode - standard output to screen.\n"" -v verbose mode - max output to screen [default].\n\n"" -e print expected test results and exit.\n"" -h print this message and exit.\n\n");return 0;}
}//CU_initialize_registry  registry初始化//用戶在調用任何其他CUnit函數之前調用本函數,如果不這樣做可能會導致系統崩潰。
if (CU_initialize_registry()) {printf("\nInitialization of Test Registry failed.");
}else {AddTests();//CU_basic_set_mode()設置運行模式CU_basic_set_mode(mode);//CU_set_error_action設置錯誤發生時,系統的行為CU_set_error_action(error_action);//CU_basic_run_tests  運行Tests  Basic Mode   基本擴展編程方式  非交互式printf("\nTests completed with return value %d.\n",CU_basic_run_tests());//使用console控制交互界面的函數入口 //CU_console_run_tests();/***使用自動產生XML文件的模式********/CU_set_output_filename("E:\\xml_test\\main");CU_list_tests_to_file();CU_automated_run_tests();/***********************************/// registry釋放CU_cleanup_registry();}return 0;
}

testcase.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "CUnit.h"
#include <Automated.h>
#include <TestDB.h>
/**//*---- functions to be tested ------*/
extern int maxi(int i , int j);/**//*---- test cases ------------------*/
void testIQJ(void)
{//斷言相等比較CU_ASSERT_EQUAL(maxi(1,1),1);CU_ASSERT_EQUAL(maxi(0,-0),0);
}
void testIGJ(void)
{CU_ASSERT_EQUAL(maxi(2,1),2);CU_ASSERT_EQUAL(maxi(0,-1),0);CU_ASSERT_EQUAL(maxi(-1,-2),-1);
}
void testILJ(void)
{CU_ASSERT_EQUAL(maxi(1,2),2);CU_ASSERT_EQUAL(maxi(-1,0),0);CU_ASSERT_EQUAL(maxi(-2,-1),-1);
}
CU_TestInfo testcases[] = {{"Testing i equals j:",testIQJ},{"Testing i greater than j:",testIGJ},{"Testing i less than j:", testILJ},CU_TEST_INFO_NULL
};
/**//*---- test suites ------------------*/
int suite_success_init(void)
{ return 0; }
int suite_success_clean(void)
{ return 0; }//需要運行的test case
CU_SuiteInfo suites[] = {{"Testing the function maxi:",suite_success_init,suite_success_clean, NULL, NULL,testcases},CU_SUITE_INFO_NULL
};
/*cunit運行環境設置*/
void AddTests(void)
{//1.CU_get_registry  CU_register_suites其他一些關于注冊的內部函數,主要用于內部和測試的目的assert(NULL != CU_get_registry());assert(!CU_is_test_running());//注冊suitesif(CUE_SUCCESS != CU_register_suites(suites)){fprintf(stderr, "Register suites failed - %s ", CU_get_error_msg());exit(EXIT_FAILURE);}
}

test.c

/**
*file:test.c
**/
int maxi(int i,int j)
{return i>j?i:j;
}

修改Cunit框架

當前Result列表如下:

image-20231210171540469

當前List列表如下:

image-20231210171644702

新增一個需求:

需要在測試結果的列表中,添加一列專門用于記錄測試的值。

比如,需要記錄每個api接口的property或者value值。

【四步走】

  • 首先,添加一個成員到類中:

image-20231210171912390

  • 在解析屬性的時候,記錄到xml文件中:

    image-20231210172026718

  • 在對應的xml解析文件中修改為如下:

    image-20231210174328713

  • 在每個對應的test case中,將對應的字符串保存到結構體:

    image-20231210174444675

最終的效果如下:

image-20231210230456313

源碼下載

https://github.com/KingofHubGit/CTest

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212453.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全面解析“由于找不到hid.dll,無法繼續執行代碼”的4個解決方法

在計算機使用過程中&#xff0c;我們經常會遇到一些錯誤提示&#xff0c;其中之一就是“找不到hid.dll”。這個問題通常出現在嘗試運行某個程序或訪問某個設備時。那么&#xff0c;當我們遇到這個問題時&#xff0c;應該如何解決呢&#xff1f;本文將詳細介紹找不到hid.dll的解…

高校需要哪些大數據實訓平臺?

當前&#xff0c;數據已成為重要的生產要素&#xff0c;大數據產業作為以數據生成、采集、存儲、加工、分析、服務為主的戰略性新興產業&#xff0c;是激活數據要素潛能的關鍵支撐&#xff0c;是加快經濟社會發展質量變革、效率變革、動力變革的重要引擎。 泰迪大數據實驗…

Angular 14帶來了類型化表單和獨立組件

獨立組件通過減少對ngmodule的需求&#xff0c;有望簡化Angular應用的開發。 介紹 Angular 14是谷歌開發的、基于typescript的web應用框架的最新版本&#xff0c;它以輸入表單和獨立組件的開發者預覽版為特色。 其特性包括&#xff1a; 一個基于組件的框架&#xff0c;用于構…

Fortran讀取netcdf文件/WRF中的文件讀取

一直很好奇WRF到底如何通過netcdf庫讀取netcdf文件&#xff0c;正巧有個機會&#xff0c;試了下fortran讀取nc文件&#xff0c;總結一下。 netcdf庫 Fortran讀取nc文件需要依賴netcdf外部庫。安裝該庫以后&#xff0c;會有專門寫給ffortran函數聲明的頭文件&#xff1a;netcd…

數據類型·

定義 數據類型是指在編程語言中&#xff0c;能夠表示不同種類的數據值并對其進行操作的集合。在不同的編程語言中&#xff0c;數據類型可能有所不同&#xff0c;但通常包括基本數據類型和復合數據類型兩種。 基本數據類型通常包括整數、浮點數、布爾值、字符等。這些類型的數…

231210 刷題日報

單調棧&#xff1a; 為啥需要單調棧&#xff1f;因為棧的后入先出特性方便從棧頂刪除剛入棧的元素 496. 下一個更大元素 I 739. 每日溫度 單調對列&#xff1a; 為啥要用單調對列&#xff1f;因為像滑動窗口這種題目&#xff0c;窗口兩端都需要插入和刪除&#xff0c;所以需…

Python滿屏飄字表白代碼

? 目錄 系列文章 寫在前面 Turtle入門 滿屏飄字 寫在后面 系列文章 序號文章目錄直達鏈接表白系列1浪漫520表白代碼https://want595.blog.csdn.net/article/details/1306668812滿屏表白代碼https://want595.blog.csdn.net/article/details/1297945183跳動的愛心https://…

CF1898B Milena and Admirer(貪心)

題目鏈接 題目大意 有一個長度為 n 的數組 做操作使這個數組不遞減&#xff1a; 把一個數分成兩個數&#xff0c;例如&#xff1a;x 分為 a 和 b&#xff0c; x a b 求最小操作次數 思路 見注釋 代碼 #include<bits/stdc.h> #define int long long using names…

Shutter的安裝及使用

概要&#xff1a;本篇主要講述截圖軟件Shutter的安裝和使用&#xff0c;操作系統是Ubuntu22.04 一、安裝 sudo apt install shutter 二、區域截圖 1、打開Shutter&#xff0c;點擊Selection 2、提示信息 3、框選矩形區域 按住鼠標左鍵&#xff0c;拖動鼠標&#xff0c;松…

IT行業最被低估的六項技術,再加上一項尚未消亡的技術

2023年&#xff0c;生成式人工智能——更具體地說是ChatGPT——吸引了業界的廣泛關注&#xff0c;深得董事會、首席執行官和其他高管的一致贊賞&#xff08;也不乏害怕情緒&#xff09;。當然&#xff0c;他們的熱情是有道理的&#xff0c;多項研究發現&#xff0c;人工智能正在…

Electron[4] Electron最簡單的打包實踐

1 背景 前面三篇已經完成通過Electron搭建的最簡單的HelloWorld應用了&#xff0c;雖然這個應用還沒添加任何實質的功能&#xff0c;但是用來作為打包的案例&#xff0c;足矣。下面再分享下通過Electron-forge來將應用打包成安裝包。 2 依賴 在Electron[2] Electron使用準備…

[山東大學操作系統課程設計]實驗四+實驗五

0.寫在前面&#xff1a; 為什么這次把兩個實驗放在一起寫了&#xff0c;因為實驗五的要求就是在實驗四的基礎上完成實現的。但是我得實現說明&#xff0c;我的實驗四雖然完成了要求&#xff0c;但是無法在我自己的實驗四的基礎上完成實驗五&#xff0c;這是一個很大的問題&…

軟考考前背過-軟件設計師

今年5月份開始準備考&#xff0c;沒想到會突然改革&#xff0c;還好刷題刷的多&#xff0c;也過了。 跟著B站up主的視頻學的&#xff0c;都學了一遍之后才開始刷題&#xff0c;平時要上班&#xff0c;也就下班和周末能學&#xff0c;時間可能拉的比較長&#xff0c;學完前面的內…

使用linux CentOS本地部署SQL Server數據庫

&#x1f308;個人主頁&#xff1a;聆風吟 &#x1f525;系列專欄&#xff1a;數據結構、Cpolar雜談 &#x1f516;少年有夢不應止于心動&#xff0c;更要付諸行動。 文章目錄 &#x1f4cb;前言一. 安裝sql server二. 局域網測試連接三. 安裝cpolar內網穿透四. 將sqlserver映射…

【注冊測繪師備考——1.中華人民共和國測繪法】

學習一下《中華人民共和國測繪法》原始網址如下 《中華人民共和國測繪法》 中華人民共和國測繪法 &#xff08;1992年12月28日第七屆全國人民代表大會常務委員會第二十九次會議通過 2002年8月29日第九屆全國人民代表大會常務委員會第二十九次會議第一次修訂 2017年4月27日…

【Vulnhub 靶場】【Funbox: GaoKao】【簡單】【20210606】

1、環境介紹 靶場介紹&#xff1a;https://www.vulnhub.com/entry/funbox-gaokao,707/ 靶場下載&#xff1a;https://download.vulnhub.com/funbox/FunboxGaoKao.ova 靶場難度&#xff1a;簡單 發布日期&#xff1a;2021年06月06日 文件大小&#xff1a;1.3 GB 靶場作者&#…

[BJDCTF2020]EzPHP 許多的特性

這道題可以學到很多東西 靜下心來慢慢通過本地知道是干嘛用的就可以學會了 BJDctf2020 Ezphp_[bjdctf2020]ezphp-CSDN博客 這里開始 一部分一部分看 $_SERVER[QUERY_SRING]的漏洞 if($_SERVER) { if (preg_match(/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|…

Windows 上安裝nvm node版本管理工具 windows安裝nvm 管理工具

Windows 上安裝nvm node版本管理工具 windows安裝nvm 管理工具 1、nvm2、安裝2.1、下載 NVM 安裝程序進行安裝2.2、打開nvm的安裝路徑&#xff0c;運行終端測試是否安裝成功2.3、配置環境變量&#xff0c;讓nvm能在電腦全局使用2.3.1、nvm配置淘寶鏡像2.3.2、nvm環境變量設置 1…

低代碼還是好用的,我持有這個觀念

低代碼開發是近年來迅速崛起的軟件開發方法&#xff0c;讓編寫應用程序變得更快、更簡單。 有人說它是美味的膳食&#xff0c;讓開發過程高效而滿足&#xff0c;但也有人質疑它是垃圾食品&#xff0c;缺乏定制性與深度。 你認為低代碼到底是美味的膳食還是垃圾食品呢&#xff0…

SQL數據庫-客觀題 復習

一.單選 2.學校新開發了一個系統&#xff0c;通過收集與分析學生的學習行為&#xff0c;對其進行精準畫像&#xff0c;進而提供個性化的學習策略&#xff0c;這屬于________系統。 答案&#xff1a;D 知識點&#xff1a;【32010200】 知識考核要求&#xff1a;【3】 能力考…