• C++单元测试 之 gtest -- 组合数计算.


    本文将介绍如何使用gtest进行单元测试. 

    gtest是google单元测试框架.使用非常方便.

    首先,下载gtest (有些google项目包含gtest,如 protobuf),复制目录即可使用.

    http://code.google.com/p/googletest/ 

    如果被墙,就百度搜下,很多.

    解压 gtest.zip, 得到gtest.1.x.x目录.

    export GTEST_HOME=该目录

    编译:
    cd $GTEST_HOME/make
    make

    运行示例程序, 熟悉 gtest风格
    ./sample1_unittes

    编译后还会得到一个 gtest_main.a 的静态库.
    ln -s gtest_main.a libgtest.a
    软链接以便符合 gcc 库引用规范.

    按 sample1_unittes.cc 写好自己的测试代码(test.cpp)后,就可以开始编译

    g++ -I$GTEST_HOME/include -L$GTEST_HOME/make -lgtest test.cpp -o test.exe
    生成测试程序 test.exe

    组合数计算代码 combination.cpp:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "combination.h"
    
    long combination(long base,long select) {
    long res=0;
    if(base<select || base <= 0) return 0;
    if(base==select) return 1;
    if(select >= base - select) {
    res=arrangement(select+1,base) / arrangement (1,base - select);
    }
    else {
    res=arrangement(base-select+1,base) / arrangement (1,select);
    }
    return res;
    }
    
    
    long arrangement(long start,long end) {
    if( start <= 0 || start > end) {
    return 1;
    }
    long res=start;
    for(long i=start+1;i<=end;i++) {
    res*=i;
    }
    return res;
    } 

    头文件combination.h: 

    long combination(long base,long select);
    long arrangement(long start,long end); 

    测试代码 gtest_combination.cpp

    #include <limits.h>
    #include "combination.h"
    #include <gtest/gtest.h>
    
    
    TEST(arrangement, all) {
      EXPECT_EQ(1, arrangement(0,1));
      EXPECT_EQ(1, arrangement(1,1));
      EXPECT_EQ(1, arrangement(1,0));
      EXPECT_EQ(1, arrangement(5,0));
      EXPECT_EQ(2, arrangement(2,2));
      EXPECT_EQ(24, arrangement(2,4));
      EXPECT_EQ(120, arrangement(1,5));
      EXPECT_EQ(7*8*9, arrangement(7,9));
    
    }
    
    TEST(combination, all) {
      EXPECT_EQ(0, combination(0,1));
      EXPECT_EQ(0, combination(0,0));
      EXPECT_EQ(0, combination(-1,1));
      EXPECT_EQ(0, combination(1,2));
      EXPECT_EQ(1, combination(1,1));
      EXPECT_EQ(2, combination(2,1));
      EXPECT_EQ(3, combination(3,1));
      EXPECT_EQ(1, combination(2,2));
      EXPECT_EQ(3, combination(3,2));
      EXPECT_EQ(1, combination(3,3));
      EXPECT_EQ(1, combination(4,0));
      EXPECT_EQ(4, combination(4,1));
      EXPECT_EQ(6, combination(4,2));
      EXPECT_EQ(4, combination(4,3));
      EXPECT_EQ(1, combination(4,4));
      EXPECT_EQ(0, combination(4,5));
      EXPECT_EQ(84, combination(9,3));
    }

    Makefile:

    TEST=gtest_combination
    TESTOBJ=$(TEST).o
    TAROBJ=combination.o

    all: $(TEST)

    $(TEST): $(TESTOBJ) $(TAROBJ)
    g++ -I$(GTEST_HOME)/include -L$(GTEST_HOME)/make -lgtest $^ -o $@

    %.o: %.cpp
    g++ -c -I$(GTEST_HOME)/include -g -o $@ $<

    编译及测试:

    $make

    $gtest_combination

    输出结果:

    Running main() from gtest_main.cc
    [==========] Running 2 tests from 2 test cases.
    [----------] Global test environment set-up.
    [----------] 1 test from arrangement
    [ RUN ] arrangement.all
    [ OK ] arrangement.all (0 ms)
    [----------] 1 test from arrangement (0 ms total)

    [----------] 1 test from combination
    [ RUN ] combination.all
    [ OK ] combination.all (0 ms)
    [----------] 1 test from combination (0 ms total)

    [----------] Global test environment tear-down
    [==========] 2 tests from 2 test cases ran. (6 ms total)
    [ PASSED ] 2 tests.

  • 相关阅读:
    Jquery复习DAY1(jQuery 选择器 jQuery 样式操作 jQuery 效果)
    git知识
    简单分析vue计算属性和methods方法的区别
    vue生命周期
    elementUI的级联选择器Cascader 高度不匹配问题高度溢出错误
    .Net Core3.1 常用的服务注入
    判断是否为AJAX请求
    JWT权限验证
    CodeSmith介绍
    常见ORM介绍
  • 原文地址:https://www.cnblogs.com/aauutthh/p/3949246.html
Copyright © 2020-2023  润新知