极简单元测试示例(以除法为例)

极简系列目录

  1. 极简博客园使用MarkDown介绍
  2. 极简单元测试示例(以除法为例)
  3. 极简Word排版示例(以Word2013为例)
  4. 极简github项目创建与提交

一、示例

说明
以除法为例子做一个C的极简单元测试示例,请大家学习,tiny_unit_test.h可直接拿去用。
本次作业的功能是calc,不是div,此处拿div做例子,只是为了给大家一个最基本的单元测试示例。
Java和C#的同学们请使用那些语言的Assert之类的,例如参考这个:http://www.cnblogs.com/greyzeng/p/4439080.html

写一个最简单单元测试工具宏

  • tiny_unit_test.h
#ifndef __TINY_UNIT_TEST_H__
#define __TINY_UNIT_TEST_H__

#define FAIL() printf("\nfailure in %s() line %d\n", __FUNCTION__, __LINE__)
#define tut_assert(test) do { if (!(test)) { FAIL(); return 1; }} while(0)

#endif

实现除法API:

  • div.h
#ifndef __DIV_H__
#define __DIV_H__

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

#define RESULT_SUCCESS 0
#define RESULT_FAILED  1

// ## 除法计算
// - 如果计算成功,使用r返回计算结果,否则不改变r的指
// - 如果计算正常,则返回RESULT_SUCCESS
// - 如果出现b为0,则返回RESULT_FAILED
// - 如果除不尽,则返回RESULT_FAILED
int div(int a,int b, int* r);

#endif
  • div.cpp
#include "div.h"

int div(int a,int b, int* r)
{
    if(b==0)
    {
        return RESULT_FAILED;
    }

    int rem = a%b;
    if(rem!=0)
    {
        return RESULT_FAILED;
    }
    *r = a/b;

    return RESULT_SUCCESS;
}

使用tiny_unit_test.h的测试宏为除法API做单元测试

  • test_div.cpp
#include <stdio.h>
#include <stdlib.h>

#include "tiny_unit_test.h"
#include "div.h"

int test_div()
{
    int result=0;
    int ret=RESULT_FAILED;

    printf("->测试相同的数相除\n");
    ret = div(-100,-100,&result);
    tut_assert(ret==RESULT_SUCCESS);
    tut_assert(result==1);

    printf("->测试0除任何数\n");
    ret = div(0,1,&result);
    tut_assert(ret==RESULT_SUCCESS);
    tut_assert(result==0);

    printf("->测试被除数为0\n");
    ret = div(20,0,&result);
    tut_assert(ret==RESULT_FAILED);

    printf("->测试除不尽的情况\n");
    ret = div(10,7,&result);
    tut_assert(ret==RESULT_FAILED);

    //下面的语句将触发单元测试失败
    tut_assert(result==1);

    return 0;
}

// 本文件只做单元测试程序
// 用以测试目标API,此处指div
// 应用程序请另写
int main(int argc,char** argv)
{
    if(test_div()==0)
    {
        printf("成功,除法单元测试通过。");
    }
    else
    {
        printf("错误,除法单元测试未通过。");
    }

    system("pause");

    return 0;
}

编译,并运行单元测试程序(注意,应用程序请另外写,单元测试程序只是用来做API的测试)

二、框架

每种语言都有现成的单元测试框架。但是,无论你是使用那种语言,都应该首先脱离单元测试框架去理解单元测试,比如可以像本文那样自己捣鼓个简易的单元测试感受一下,然后具体使用的话,还是可以找每种语言对应的单元测试框架去用。每种语言推荐一种单元测试框架,这是因为,推荐100种是没用的,理解了并用的好,只要一种就可以用的利索。每种测试框架也只给出官方的文档,这是因为,最好的文档就是官方文档。

  • C
    • 最简易的C测试雏形是: assert
    • CUnit
    • CUnit Progammers Guide
  • C++
    • Google Test Framework
    • Google Test Framework Tutorial
    • ibm站点上的例子
  • C#
    • Visual Studio有自带的Unit Test Framework,可以为每个项目自动生成测试工程和测试代码
    • 第二个选择是NUnit
    • NUnit Quick Start
    • 这篇文章简单介绍了三种VS的单元测试框架用法Introduction to Unit Testing with: MS tests, NUnit and Fluent Assertions
  • Java
    • JUnit
    • JUnit Getting Started
    • JUnit wiki,重点看JUnit Usage and Idioms
    • 如果开发Android应用,可以参考这篇介绍在Android Studio下的测试:Android application testing with the Android test framework - Tutorial
      • Android Testing
      • Hello Android Testing
  • JavaScript
    • gjstest
    • gistest Getting Started
  • PHP
    • PHPUnit在Windows下的配置及使用

说到底,单元测试是什么?

我的理解,单元测试就是对一段代码运行时前后条件的断言。我们都做过数学证明题,我们先假设了一个条件成立,然后基于这个假设做推导。每一行代码都有当前代码能正确执行的假设条件,如果这个假设条件不成立,则代码的运行时正确性就无法保证。单元测试就是在函数级别、类级别、模块级别分别对各个粒度假设的验证。所以从这个角度来说,并不是有了单元测试,程序的质量就一定得到保证。而是当你的单元测试代码,能把一个函数、一个类、一个模块、一个程序的各种关键性假设全面覆盖的测试,那么当所有单元测试都通过时,程序的正确性就得到了极大的保证。

你可能感兴趣的:(极简单元测试示例(以除法为例))