单元测试框架

作者: 生命科学  发布:2019-10-04

CPPUTest 虽然名称上看起来是 C++ 的单元测试框架, 其实它也是支持测试 C 代码的.

CPPUTest 单元测试框架(针对 C 单元测试的使用说明),cpputest单元测试

CPPUTest 虽然名称上看起来是 C++ 的单元测试框架, 其实它也是支持测试 C 代码的.

本文主要介绍用CPPUTest来测试 C 代码. (C++没用过, 平时主要用的是C) C++相关的内容都省略了.

本文基于 debian v7.6 x86_64.

 

本文主要介绍用CPPUTest来测试 C 代码. (C++没用过, 平时主要用的是C) C++相关的内容都省略了.

1. CPPUTest 安装

现在各个Linux的发行版的源都有丰富的软件资源, 而且安装方便.

但是如果想要在第一时间使用最新版本的开源软件, 还是得从源码安装.

 

debian系统为了追求稳定性, apt源中的软件一般都比较旧. 所以本文中的例子是基于最新源码的CPPUTest.

 

本文基于 debian v7.6 x86_64.

1.1 apt-get 安装

$ sudo apt-get install cpputest

 

 

1.2 源码安装

1. 下载源码, 官网:

2. 编译源码

$ tar zxvf cpputest-3.6.tar.gz
$ cd cpputest-3.6/
$ ./configure
$ make

 

最后我没有实际安装, 而是直接使用编译出的二进制。

 

1. CPPUTest 安装

现在各个Linux的发行版的源都有丰富的软件资源, 而且安装方便.

但是如果想要在第一时间使用最新版本的开源软件, 还是得从源码安装.

 

debian系统为了追求稳定性, apt源中的软件一般都比较旧. 所以本文中的例子是基于最新源码的CPPUTest.

 

2. CPPUTest 介绍

1.1 apt-get 安装

$ sudo apt-get install cpputest

 

2.1 构造待测试代码 (C语言)

/* file: sample.h */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Student 
{
    char* name;
    int score;
};

void ret_void(void);
int ret_int(int, int);
double ret_double(double, double);
char* ret_pchar(char*, char*);

struct Student* init_student(struct Student* s, char* name, int score);

 

/* file: sample.c */

#include "sample.h"

#ifndef CPPUTEST
int main(int argc, char *argv[])
{
    char* pa;
    char* pb;
    pa = (char*) malloc(sizeof(char) * 80);
    pb = (char*) malloc(sizeof(char) * 20);

    strcpy(pa, "abcdefg");
    strcpy(pb, "hijklmn");

    printf ("Sample Start......n");

    ret_void();
    printf ("ret_int: %dn", ret_int(100, 10));
    printf ("ret_double: %.2fn", ret_double(100.0, 10.0));
    printf ("ret_pchar: %sn", ret_pchar(pa, pb));

    struct Student* s = (struct Student*) malloc(sizeof(struct Student));
    s->name = (char*) malloc(sizeof(char) * 80);

    init_student(s, "test cpputest", 100);
    printf ("init_Student: name=%s, score=%dn", s->name, s->score);
    printf ("Sample End  ......n");
    free(pa);
    free(pb);
    free(s->name);
    free(s);

    return 0;
}
#endif

void ret_void()
{
    printf ("Hello CPPUTest!n");
}

/* ia + ib */
int ret_int(int ia, int ib)
{
    return ia + ib;
}

/* da / db */
double ret_double(double da, double db)
{
    return da / db;
}

/* pa = pa + pb */
char* ret_pchar(char* pa, char* pb)
{
    return strcat(pa, pb);
}

/* s->name = name, s->score = score */
void init_student(struct Student* s, char* name, int score)
{
    strcpy(s->name, name);
    s->score = score;
}

 

1.2 源码安装

1. 下载源码, 官网:

2. 编译源码

$ tar zxvf cpputest-3.6.tar.gz
$ cd cpputest-3.6/
$ ./configure
$ make

 

最后我没有实际安装, 而是直接使用编译出的二进制。

 

2.2 测试用例的组成, 写法

CPPUTest 的测试用例非常简单, 首先定义一个 TEST_GROUP, 然后定义属于这个 TEST_GROUP 的 TEST.

需要注意的地方是:

  1. 引用 CPPUTest 中的2个头文件

    #include #include

 

  1. 引用 C 头文件时, 需要使用 extern "C" {}

    extern "C" { #include "sample.h" }

 

下面的例子是测试 sample.c 中 ret_int 的代码.

构造了一个测试成功, 一个测试失败的例子

/* file: test.c */

#include <CppUTest/CommandLineTestRunner.h>
#include <CppUTest/TestHarness.h>

extern "C"
{
#include "sample.h"
}


/* 定义个 TEST_GROUP, 名称为 sample */
TEST_GROUP(sample)
{};

/* 定义一个属于 TEST_GROUP 的 TEST, 名称为 ret_int_success */
TEST(sample, ret_int_success)
{
    int sum = ret_int(1, 2);
    CHECK_EQUAL(sum, 3);
}

/* 定义一个属于 TEST_GROUP 的 TEST, 名称为 ret_int_failed */
TEST(sample, ret_int_failed)
{
    int sum = ret_int(1, 2);
    CHECK_EQUAL(sum, 4);
}

int main(int argc, char *argv[])
{
    CommandLineTestRunner::RunAllTests(argc, argv);
    return 0;
}

 

2. CPPUTest 介绍

2.3 测试用例结果判断 ( fail, 各种assert等等)

测试完成后, 可以用 CPPUTest 提供的宏来判断测试结果是否和预期一致.

CPPUTest 提供的用于判断的宏如下: (上面的测试代码就使用了 CHECK_EQUAL)

Assertion 宏

含义

CHECK(boolean condition) condition==True则成功; 反之失败
CHECK_TEXT(boolean condition, text) condition==True则成功; 反之失败, 并且失败时输出 text信息
CHECK_EQUAL(expected, actual) expected==actual则成功; 反之失败
CHECK_THROWS(expected_exception, expression) 抛出的异常 expected_exception==exception则成功; 反之失败
STRCMP_EQUAL(expected, actual) 字符串 expected==actual则成功; 反之失败
LONGS_EQUAL(expected, actual) 数字 expected==actual则成功; 反之失败
BYTES_EQUAL(expected, actual) 数字 expected==actual则成功; 反之失败 (数字是 8bit 宽)
POINTERS_EQUAL(expected, actual) 指针 expected==actual则成功; 反之失败
DOUBLES_EQUAL(expected, actual, tolerance) double型 expected和actual在误差范围内(tolerance)相等则成功; 反之失败
FAIL(text) 总是失败, 并输出 text 信息

 

本文由金沙澳门官网发布于生命科学,转载请注明出处:单元测试框架

关键词:

上一篇:单元测试框架
下一篇:没有了