Cunit单元测试框架-移植arm平台

一. CUnit Linux下环境搭建部分指令说明基本说明

1.autoconf 是一个用于生成shell脚本的工具,可以自动配置软件源代码以适应多种类似POSIX的系统。为了让你的软件包在所有的不同系统上都可以进行编译
2…/configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
3.make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

二.CUnit arm平台环境配置安装(这里是基于已经安装过Cunit,只是更改运行平台,Cunit的详细安装,详见“cunit基于Linux单元测试环境搭建”)

1.这里configure配置默认的是gcc编译器,现在我们的arm平台的交叉编译器是arm-linux-gnueabihf-gcc,所以接下来,我们需要更改编译器

linux下执行如下命令(执行目录为cunit源码安装包的位置):

root@ubuntu:/home/mf/CUnit-2.1-3# ./configure --prefix=`pwd`/release CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --host=arm-linux

指令说明:
当我们需要指导./configure的参数设置的时候 ,可以执行./configure --help显示所有的参数设置
–prefix=指定cunit软件安装的位置,这里是当前目录下面的/release文件夹,即/home/mf/CUnit-2.1-3/release
CC=指定编译器的类型,这里我们设备的交叉编译工具是arm-linux-gnueabihf-gcc
CXX=指定c++交叉编译工具,arm-linux-gnueabihf-gcc++
–host=指定软件运行的系统平台.如果没有指定,将会运行`config.guess’来检测.指令指定 arm平台

2.root@ubuntu:/home/mf/CUnit-2.1-3#make
3.root@ubuntu:/home/mf/CUnit-2.1-3#make install

安装完成,没有报错
安装完成查看lib库是否存在,存在,成功啦
在这里插入图片描述

三.测试脚本编译

这里用到四个文件:Main.c test.c testcase.c Makefile
放在Linux 下面新建的 root@ubuntu:/home/mf/Desktop/cunittest目录下
Main.c

#include 
#include 
#include 
#include 
#include "Basic.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());
        // registry释放
        CU_cleanup_registry();
    }
    return 0;
}

testcase.c

#include 
#include 
#include 
#include 
#include 
#include 
/**//*---- 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());
    //注册suites
    if(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;
}

Makefile

INC=-I/home/mf/CUnit-2.1-3/release/include/CUnit
LIB=-L/home/mf/CUnit-2.1-3/release/lib
all:Main.c test.c testcase.c
	arm-linux-gnueabihf-gcc -o test $(INC) $(LIB) $^ -lcunit
clean:
	-rm -rf *.o test

Makefile文件说明:INC=和LIB=的路径都要改成arm平台的cunit安装的路径
直接root@ubuntu:/home/mf/Desktop/cunittest# make
生成可执行文件test

四.在设备平台执行可执行文件

1.连接设备,打开控制台,连接设备的网络

设备网络连接的设置:
上传ftpd文件
chmod 777 ftpd
tcpsvd -vE 0.0.0.0 21 /ftpd -wvvS / &
ifconfig eth0 192.168.0.100
电脑设置和设备同一个网段
打开filezilla工具:
Cunit单元测试框架-移植arm平台_第1张图片
上传基于arm平台lib库到设备的lib目录下面
上传完毕后,在设备控制台执行ldconfig命令加载lib库

2.上传可执行文件test到设备
3.修改可执行文件的权限 chmod 777 test
4.运行可执行文件./test,显示测试结果到控制台,移植成功
Cunit单元测试框架-移植arm平台_第2张图片

你可能感兴趣的:(嵌入式软件基础,单元测试)