第二次作业

本文章初次发表于Cmd-Markdown编辑阅读器,若出现排版问题或想获得更好的显示效果,请访问上述地址。

1. 测试工具 Catch的初步了解和使用


1. Catch简介

由于本次作业的主要目的是实现简单的单元测试,不需要太多额外的功能,再加上个人不喜欢使用太过笨重的VS,故使用一种更加轻便的测试工具Catch
Catch工具发布于GitHub,可以通过如下链接访问Catch主页。从其主页可以了解到,Catch是C++的头文件自动测试工具,同时包含多种时下流行的测试框架和方法,简单的单元测试自然不在话下。

Catch stands for C++ Automated Test Cases in Headers and is a multi-paradigm automated test framework for C++ and Objective-C (and, maybe, C).

接下来阅读使用方法,得知Catch项目只是一个头文件,下载catch.hpp。调整环境变量包含或者直接放进文件夹目录即可使用。

The simplest way to get Catch is to download the latest single header version.
Catch is header only. All you need to do is drop the file(s) somewhere reachable from your project - either in some central location you can set your header search path to find, or directly into your project tree itself! This is a particularly good option for other Open-Source projects that want to use Catch for their test suite.


2. 如何使用catch书写测试

官方的文档很详细,但是理解了还会觉得有些罗嗦,我简单解释一下catch测试工具的用法。下面举一个栗子,这是一个已经包含了catch头文件和待测试文件的文件夹,文件结构应该是这样的。

.
├── catch.hpp
└── moudle1.cpp
  1. 使用测试的第一步自然是写测试了,创建一个新的文件,包含需要测试的文件,再包含的catch.hpp。这样准备工作就完成了,接下来就可以开始写测试用例了。

  2. 准备完成了,那么该如何写测试呢?查阅官方的tutorial文档可知,测试的初步书写方法如下,还初步了解到了TEST_CASE的两个参数的含义。

    TEST_CASE( "Factorials are computed", "[factorial]" ) {
        REQUIRE( Factorial(1) == 1 );
        REQUIRE( Factorial(2) == 2 );
        REQUIRE( Factorial(3) == 6 );
        REQUIRE( Factorial(10) == 3628800 );
    }
    

    TEST_CASE( test name [, tags ] )

    书写完的测试文件应该是这样的。

     //moudle1-test.cpp
     #include "catch.hpp"
     #include "fact.cpp"//包含功能实现文件
     TEST_CASE( "Factorials are computed", "[factorial]" ) {
        REQUIRE( Factorial(1) == 1 );
        REQUIRE( Factorial(2) == 2 );
        REQUIRE( Factorial(3) == 6 );
        REQUIRE( Factorial(10) == 3628800 );
     }
    
  3. 现在测试写完了,那么如何运行呢?tutorial文档中为了简便采取了单文件测试的方法,但是实际上是不推荐的。
    再次强调一遍:除非需要测试的内容或者测试用例极少,否则不推荐将运行测试文件和测试实现文件书写在一起。最佳的方式还是将运行测试的文件和测试实现的文件分开。

  • The requirement is that the following block of code (or equivalent):
    #define CATCH_CONFIG_MAIN
    #include "catch.hpp"
    appears in exactly one source file.
  • Each additional file need only #include "catch.hpp" - do not repeat the #define!
正如上面节选的文档内容,只需要在**一个文件**中书写这两行即可,而且也不需要多余的内容。其余测试文件**禁止**包含上述的`#define`内容。

为什么需要有一个文件要多写一行呢?这一行有什么用?又为什么要写呢?
结论显而易见。这个与众不同的测试文件自然就是运行测试文件了,多出的这一行自然是调用内置的main函数,编译这个文件即可得到测试结果。最后还要提醒一点,测试运行文件记得包含其余的测试文件,只有这两行自然是无法测试的,再举一个栗子。
C //test-run.cpp #define CATCH_CONFIG_MAIN #include "catch.hpp" #include "moudle1-test.cpp"//上面写好的测试文件

做好所有工作,最后我们的文件结构应该是这样的。

.
├── catch.hpp
├── moudle1.cpp
├── moudle1-test.cpp
└── test-run.cpp

然后g++ test-run.cpp ./a.out即可得到测试结果。
若想查看整体代码,请点击我的coding.net

2. 编写测试用例,验证


学会了工具的使用,剩下的就很简单了,挑选各种的测试样例,对边界和各种意外情况进行测试。同时发现问题进行修改。以下是我的测试样例和测试结果。

用例编号 用例描述 输入数据 预期输出数据 实际输出数据 通过/不通过 评价
1 递增正数 1,2,3,9,11,999 1025 1025 通过 结果正常
2 递减负数 -1, -2, -3, -6, -9, -11 -1 -1 通过 结果正常
3 随机数字 64, -3456, 568, 345, -568, 46 913 913 通过 结果正常
4 单个正数 9 9 9 通过 结果正常
5 单个负数 -13 -13 -13 通过 结果正常

3. 总结


经过上面的学习,就初步掌握了catch测试工具的初步使用方法,同时也对单元测试进行了实践,同时也熟练了linux命令行的操作技术。然而catch工具还有很多其他的测试功能,诸如BDD、TDD都有,linux命令行也还有很多要学的地方。继续学习,进而掌握这个测试工具,接着熟悉,经常使用命令行提高自己的技能,以后的代码书写和对Linux系统的理解也会事半功倍。

posted @ 2016-10-08 19:43  ysrcyx  阅读(183)  评论(0编辑  收藏  举报