C语言单元测试框架——CUnit 安装(windows和Linux)及使用

这篇具有很好参考价值的文章主要介绍了C语言单元测试框架——CUnit 安装(windows和Linux)及使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


昨天把软件测试基础基本上看完了,因为我最近工作问题,需要着重研究下Cunit这个单元测试框架,上午把之前学的基础整理出来了。
刚刚研究了下Cunit除了基本 (Basic)接口,还有三个接口没使用过,我也会经量都尝试下。

下个星期我的任务是写一个墨水屏的驱动,测试的学习估摸着会比较慢了,不会像前面一天一篇道两篇的笔记记录,咱尽量嗷。

CUnit

上面纯属瞎扯淡嗷,接下来本来也想着cv一些简介什么的,想了想算了,几乎每篇文章都有,咱直接附上具有代表性的一个自己看吧。

CUnit首页
CUnit文档手册
CUnit用户手册(中文)
CUnit 2-1-3下载地址

看过学习软件测试(一)C单元测试、测试基本流程、HTML基础这篇文章的应该也看过了其中一部分内容,这篇文章整理汇总了下。

CUnit Windows 安装

cunit在windows下安装:https://blog.csdn.net/godmaycry/article/details/77480549 (已验证可用)

https://cloud.tencent.com/developer/article/1648952 文章中提到以下问题 (但我没遇到错误,以及提到了使用VS Code IDE)
安装完毕把C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\msys\mingw\lib\libcunit.a拷贝到
C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\lib。
(不拷贝在下面gcc或者clang运行中,加入-lcunit参数会提示..lib: can’t find -lcunit的错误)

接下来把C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\msys\mingw\include\CUnit\目录中的所有.h文件
拷贝到C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\include中去。

注意:编译的时候需要连接cunit 
示例:gcc -o test test.c -lcunit

CUnit Linux(Ubuntu) 安装

软件源中与CUnit相关的包有:

libcunit1 libcunit1-dev libcunit1-doc libcunit1-ncurses libcunit1-ncurses-dev

使用apt-get install安装即可。

安装步骤

tar -jxvf CUnit-2.1-3.tar.bz2
cd CUnit-2.1-3
libtoolize -f -c -i
aclocal
autoconf
autoheader
automake
chmod u+x configure
./configure –prefix=/opt/cunit
make
make install

cunit安装成功后会生成4个文件夹:doc、include、lib、share。

  • doc目录是一些简介以及使用说明。
  • include和lib目录中是我们需要的头文件以及库文件。
  • share目录中有Automated模式下需要的文件。

一键把cunit测试结果(Basic)和gcov覆盖率结果合并

gcov

gcc -fprofile-arcs -ftest-coverage -o test test.c    编译生成可执行文件(test).gcno文件
执行可执行文件./test 生成文件gcda
gcov test.c 生成gcov文件,该文件有代码覆盖率和每行代码执行次数

python代码

main.py

print("Hello World %d " % 2)
flist = ['data1.txt','data2.txt']
ofile = open('list.txt','w')
for fr in flist:
    for txt in open(fr, 'r'):
        print(txt)
        ofile.write(txt)
ofile.close()

bat代码

gcc -fprofile-arcs -ftest-coverage -o test _4_book.c -lcunit
test.exe => data1.txt
gcov _4_book.c => data2.txt
ren _4_book.c.gcov data3.txt
main.py
del data1.txt
del data2.txt

cunit测试代码(拿官方历程改了下)

/*
 *  Simple example of a CUnit unit test.
 *
 *  This program (crudely) demonstrates a very simple "black box"
 *  test of the standard library functions fprintf() and fread().
 *  It uses suite initialization and cleanup functions to open
 *  and close a common temporary file used by the test functions.
 *  The test functions then write to and read from the temporary
 *  file in the course of testing the library functions.
 *
 *  The 2 test functions are added to a single CUnit suite, and
 *  then run using the CUnit Basic interface.  The output of the
 *  program (on CUnit version 2.0-2) is:
 *
 *           CUnit : A Unit testing framework for C.
 *           http://cunit.sourceforge.net/
 *
 *       Suite: Suite_1
 *         Test: test of fprintf() ... passed
 *         Test: test of fread() ... passed
 *
 *       --Run Summary: Type      Total     Ran  Passed  Failed
 *                      suites        1       1     n/a       0
 *                      tests         2       2       2       0
 *                      asserts       5       5       5       0
 */

/* 根据书上程序流图编写 */

#include <stdio.h>
#include <string.h>
#include "CUnit/Basic.h"

/* Pointer to the file used by the tests. */
static FILE *temp_file = NULL;

/* The suite initialization function.
 * Opens the temporary file used by the tests.
 * Returns zero on success, non-zero otherwise.
 */
/* 第一步 套件初始化 编写init套件*/
int init_suite1(void)
{
   if (NULL == (temp_file = fopen("temp.txt", "w+")))
   {
      return -1;
   }
   else
   {
      return 0;
   }
}

/* The suite cleanup function.
 * Closes the temporary file used by the tests.
 * Returns zero on success, non-zero otherwise.
 */
/* 第一步 套件初始化 编写clean套件*/
int clean_suite1(void)
{
   if (0 != fclose(temp_file))
   {
      return -1;
   }
   else
   {
      temp_file = NULL;
      return 0;
   }
}

/* Simple test of fprintf().
 * Writes test data to the temporary file and checks
 * whether the expected number of bytes were written.
 */
void testFPRINTF(void)
{
   int i1 = 10;

   if (NULL != temp_file)
   {
      CU_ASSERT(0 == fprintf(temp_file, ""));
      CU_ASSERT(2 == fprintf(temp_file, "Q\n"));
      CU_ASSERT(7 == fprintf(temp_file, "i1 = %d", i1));
   }
}

/* Simple test of fread().
 * Reads the data previously written by testFPRINTF()
 * and checks whether the expected characters are present.
 * Must be run after testFPRINTF().
 */
void testFREAD(void)
{
   unsigned char buffer[20];

   if (NULL != temp_file)
   {
      rewind(temp_file);
      CU_ASSERT(9 == fread(buffer, sizeof(unsigned char), 20, temp_file));
      CU_ASSERT(0 == strncmp(buffer, "Q\ni1 = 10", 9));
   }
}

float bookExample(float x,float y,float z)
{
   if ((y>1) && (z==0))
   {
      x = x/y;
   }

   if ((y==2) || (x>1))
   {
      x = x+1;
   }
   
   return x;
}

void testBookExample(void)
{
   //满足判定覆盖标准的测试用例
   CU_ASSERT(2 == bookExample(1,2,1))
   CU_ASSERT(1 == bookExample(3,3,0))

   //满足条件覆盖标准的测试用例
   CU_ASSERT(1.5 == bookExample(1,2,0))
   CU_ASSERT(3 == bookExample(2,1,1))

   //满足判定/条件覆盖标准的测试用例
   CU_ASSERT(3 == bookExample(4,2,0))
   CU_ASSERT(1 == bookExample(1,1,1))

   //满足条件组合覆盖标准的测试用例
   CU_ASSERT(3 == bookExample(4,2,0))
   CU_ASSERT(2 == bookExample(1,2,1))
   CU_ASSERT(3 == bookExample(2,1,0))
   CU_ASSERT(1 == bookExample(1,1,1))

   //满足路径覆盖标准的测试用例
   CU_ASSERT(3 == bookExample(4,2,0))
   CU_ASSERT(1 == bookExample(3,3,0))
   CU_ASSERT(3 == bookExample(2,1,0))
   CU_ASSERT(1 == bookExample(1,1,1))
}

/* The main() function for setting up and running the tests.
 * Returns a CUE_SUCCESS on successful running, another
 * CUnit error code on failure.
 */
int main()
{
   CU_pSuite pSuite = NULL; //初始化结构体

   /* initialize the CUnit test registry */
   /* 第二步 初始化注册表 */
   if (CUE_SUCCESS != CU_initialize_registry())
      return CU_get_error();

   /* add a suite to the registry */
   /* 第三步 添加套件到测试注册表 */
   pSuite = CU_add_suite("Suite_1", init_suite1, clean_suite1);
   if (NULL == pSuite)
   {                         // 如果添加套件失败
      CU_cleanup_registry(); // 清理注册表并报错
      return CU_get_error();
   }

   /* add the tests to the suite */
   /* 第四步 添加测试套件 */
   /* NOTE - ORDER IS IMPORTANT - MUST TEST fread() AFTER fprintf() */
   if ((NULL == CU_add_test(pSuite, "test of fprintf()", testFPRINTF)) ||
       (NULL == CU_add_test(pSuite, "test of fread()", testFREAD)) ||
       (NULL == CU_add_test(pSuite, "test of BookExample()", testBookExample)))
   { // 如果添加测试套件失败清理注册表并报错
      CU_cleanup_registry();
      return CU_get_error();
   }

   /* Run all tests using the CUnit Basic interface */
   /* 第五步 使用适当的接口运行测试 */
   /* 
   CU_BRM_NORMAL    Normal模式-失败和运行摘要打印[default]
   CU_BRM_SILENT    静默模式-除了框架错误消息外,不输出任何输出。
   CU_BRM_VERBOSE   详细模式——运行详细信息的最大输出。
   */
   CU_basic_set_mode(CU_BRM_VERBOSE); // 设置基本接口的运行模式
   CU_basic_run_tests(); // 使用基本接口运行所有注册的CUnit测试

   /* 第六步 清理测试注册表 */
   CU_cleanup_registry();
   return CU_get_error();
}

Automated

上面的CUnit的输出方式是Basic(基本)

怎么将输出模式换成Automated?
常规的6个步骤还是不变,只需要在最后那加两个函数:CU_automated_run_tests();
CU_list_tests_to_file();

想了解细节的看文档
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
开始我尝试Automated的输出方式时生成了两个XML文件,死活显示不出来像官方截图那样的,如何我错误的去查如何查看XML文件以及XML转Markdown等等,到最后我看到了一篇文章,原来是我少了几个文件。

文章中提到

配置使用Automated模式,重新编译运行后会生成CUnitAutomated-Listing.xml和CUnitAutomated-Results.xml两个文件。文件名是在不设定的情况下,使用默认文件名。

把项目生成的CUnitAutomated-Listing.xml和CUnitAutomated-Results.xml,与CUnit安装目录下的CUnit-List.dtd、CUnit-List.xsl、CUnit-Run.dtd和CUnit-Run.xsl,
共六个文件,放到一个文件夹下,拷贝到window系统下,使用IE浏览器打开。

注意,要用IE浏览器进行打开,谷歌浏览器和狐火浏览器都无法正确打开。

C语言单元测试框架——CUnit 安装(windows和Linux)及使用
CUnitAutomated是XML默认名字
可以通过CU_set_output_filename("");函数更改名字
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
Test-Listing.xml
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
Test-Results.xml
C语言单元测试框架——CUnit 安装(windows和Linux)及使用

Console

跟automated一样,需要在第五步把运行CU_console_run_tests();

然后编译,在cmd中执行生成的可执行文件。
R就是Run全部执行basic(基本)输出
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
S是就是选择要测试的套件以及测试然后执行,不像R一样全部执行,只执行我们选择的。
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
L也就是List列表,把当前套件和需要测试的内容显示出来
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
A也就是Activate,更改test的活跃状态,也就是测不测,不活跃就不测
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
F就是Failures,查看测试失败的
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
U就是UP,我现在在suite这一层,Run也只是在当前套件中全部执行,如果up跳到上一层,就是执行全部套件(suite)的test
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
O也就是option选项,选择未激活的套件/测试被视为运行时失败。
C语言单元测试框架——CUnit 安装(windows和Linux)及使用
H也就是help帮助啦,也就是对每个字母的解释。

Q也就是quit,退出此系统。

curses

还有个cures输出模式,需要在linux下才能使用,后续我使用的话会补充。文章来源地址https://www.toymoban.com/news/detail-491700.html

到了这里,关于C语言单元测试框架——CUnit 安装(windows和Linux)及使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个简单好用的C++语言单元测试框架-GoogleTest

    GoogleTest 是由 Google 开发的一个用于编写 C++ 单元测试的框架。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在实际项目中,单元测试往往由开发人员完成。

    2024年01月19日
    浏览(95)
  • 一个简单好用的C语言单元测试框架-Unity

    Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发,旨在简化嵌入式系统的单元测试。单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在

    2024年01月21日
    浏览(56)
  • idea 安装JUnit单元测试框架

    JUnit是一套专门用于java的单元测试框架,主要是测试方法 junit4官方网站: JUnit – About junit5官方网站:JUnit 5  框架依赖:junit-4.12.jar;hamcrest-core-1.3.jar 安装步骤: (1)项目中创建lib目录 (2)把两个jar文件复制到lib目录 (3)选择lib目录然后点击右键选择“Add as Library.....

    2024年02月07日
    浏览(43)
  • linux环境编程(1): 实现一个单元测试框架-2

    在之前的文章中, 介绍了如何实现一个类似gtest的单元测试框架, 完整的项目代码可以参考这里: https://github.com/kfggww/cutest . 近期对cutest的实现做了一些修改, 包括: Test Suite的声明宏, 修改为TEST_SUITE 增加Test Suite的声明宏TEST_SUITE_WITH. 可传递Suite的init和cleanup函数, 在Suite中每个Cas

    2024年02月12日
    浏览(33)
  • 【C C++开源库】适合单片机 嵌入式的C语言单元测试库_单片机 单元测试框架

    #define TEST_ASSERT_LESS_THAN_UINT64(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT64((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_size_t(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_UINT((threshold), (actual), __LINE__, NULL) #define TEST_ASSERT_LESS_THAN_HEX8(threshold, actual) UNITY_TEST_ASSERT_SMALLER_THAN_HEX8((thres

    2024年04月25日
    浏览(47)
  • Go单元测试及框架使用

    建议Go 语言推荐测试文件和源代码文件放在一块,测试文件以 _test.go 结尾。 函数名必须以 Test 开头,后面一般跟待测试的函数名 参数为 t *testing.T 简单测试用例定义如下: 在goland中,编写好方法后,右键Generate-Test for funtion, 可自动生成单元测试代码 生成的代码如下: 需要

    2024年02月09日
    浏览(47)
  • 【单元测试】如何使用 JUnit5 框架?

      Junit5是一个用于在Java平台上进行单元测试的框架。JUnit 5 框架主要由三部分组成:JUnit Platform、JUnit Jupiter 和 JUnit Vintage。 JUnit Platform:定义了测试引擎的 API,是 JVM 上用于启动测试框架的基础服务,支持通过 IDE、构建工具、命令行等方式运行单元测试。 JUnit Jupiter:包含

    2024年04月10日
    浏览(44)
  • 使用Glib中测试框架对C代码进行单元测试

    C++项目的测试框架比较常见的是Google的 gtest (前文CMake项目使用ctest+gtest进行单元测试有使用实例介绍 gtest ,感兴趣的读者可以去看看),也有一些其它框架,比如Boost中的测试框架。这些框架虽然也可以测试C代码,但是如果在一个纯C项目中引入这些的框架,则需要使用C+

    2023年04月22日
    浏览(36)
  • Python中的单元测试框架:使用unittest进行有效测试

    在软件开发中,单元测试是一种测试方法,它用于检查单个软件组件(例如函数或方法)的正确性。Python 提供了一个内置的单元测试库,名为 unittest ,可以用来编写测试代码,然后运行测试,并报告测试结果。 本文将向你介绍如何使用 unittest 来编写和运行单元测试。通过阅

    2024年03月09日
    浏览(40)
  • C之(10)CMocka-单元测试框架使用

    CMocka基础使用 Author:Once Day Date:2023年6月15日 参考文档: GoogleTest User’s Guide | GoogleTest 嵌入式自动化单元测试(2)-Cmocka - 知乎 (zhihu.com) 使用 cmocka 进行单元测试 | 前尘逐梦 (qianchenzhumeng.github.io) cmocka - unit testing framework for C 1. 概述 1.1 介绍 CMocka 是一个用于 C 语言的单元测试框

    2024年02月05日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包