zoukankan      html  css  js  c++  java
  • gtest 自动化测试 部署

    1.部署
    a)编译框架
    1.1下载gtest库1.6.0 并解压到文件夹 "/user/{user}/gtest.1.6.0"

    下载地址:https://code.google.com/p/googletest/downloads/detail?name=gtest-1.6.0.zip&can=2&q=

    1.2安装gcc 如果已有命令行操作,GCC跳过这个步骤

    在mac下,我直接使用使用xcode4.6的扩展,操作是打开xcode ->preferences ->downloads->componnts 检查command line tools是否已安装,没有安装直接安装就行了

    1.3把下面的脚本保存为 bash脚本并放到"/user/{user}/gtest.1.6.0",命名为 create.sh并运行脚本,成功后就会产生两个文件 (libgteste.a gtest-all.o)

    g++ -I./include -I./ -c ./src/gtest-all.cc glib.o
    ar -rv libgteste.a gtest-all.o

    运行步骤:1)先打开终端运行 cd "/user/{user}/gtest.1.6.0"
    2)再运行 create.sh

    1.4创建运行环境

    1)在目标机器上先创建一个部署的目录 "/user/{user}/utest"
    2)再在创建好的文件目录下创建一个libs
    3)把1.3运行后产生成的文件libgteste.a、gtest-all.o、以及gtest库文件中的include文件夹,src目录下的gtest_main.cc 一起放到上一步创建的libs中

    b)编写脚本 (看附件run.sh)

    创建测试脚本run.sh 放到到1.4.1创建的目录下与libs同一级("/user/{user}/utest")

    c) 建立目标源码目录src 路径为 "/user/{user}/utest/src"

    这个文件夹不是必须的,是用来放被测试的目标代码,将会在run.sh脚本中的 src_path变量指定,确保在运行脚本时能找到这个路径即可

    d) 建立一个测试tests目录 "/user/{user}/utest/tests"
    这个目标也不是必须的,用来存放测试代码,将会在run.sh脚本中的 src_tests变量指定,确保在运行脚本时能找到这个路径即可

    2.编写测试

    a)目标代码(直接使用下载库的sample1.cc sample1.h)并把这个文件放到src中(如果是其它位置,在run.sh脚本中指定src_path为到相应的位置)
    b)测试用例(直接使用下载库中的sample1_unittest.h)并把这个文件放到tests中(如果是其它位置,在run.sh脚本中指定src_tests为到相应的位置)
    c)测试用例编写看gtest教程
    入门:https://code.google.com/p/googletest/wiki/V1_6_Primer
    高级:https://code.google.com/p/googletest/wiki/AdvancedGuide

    d)测试用例备注
    a)代码清单:
    测试目标代码 "/user/{user}/utest/src/sample1.h"
    测试目标代码"/user/{user}/utest/src/sample1.cc"
    测试用例 "/user/{user}/tests/tests/sample1_unittest.cc“

    b)用例备注
    1)测试目标代码 "/user/{user}/utest/src/sample1.h"
    //声明两个函数
    int Factorial(int n);
    bool IsPrime(int n);

    2)测试目标代码"/user/{user}/utest/src/sample1.cc"

    //定义
    #include "sample1.h"
    #include <stdio.h>
    #include <iostream>

    //result = n!
    int Factorial(int n) {
    int result = 1;

    for (int i = 1; i <= n; i++) {
    result *= i;
    }
    //想要保持测试报告的可阅读性,请不要在程序中使用这样的日志
    printf("inject messgae!");
    std::cout<<"cout message"<<std::endl;
    return result;
    }

    //模拟一个函数多个职责来测试不同的事件结果
    bool IsPrime(int n) {
    if (n <= 1) return false;
    if (n % 2 == 0) return n == 2;

    for (int i = 3; ; i += 2) {
    if (i > n/i) break;

    if (n % i == 0) return false;
    }
    return true;
    }

    3)测试用例 "/user/{user}/tests/tests/sample1_unittest.cc“

    #include <limits.h>
    #include "sample1.h"
    #include "gtest/gtest.h" 引用测试框架头文件,因为我们在脚本中已设置好相应的路径关系,一定要按照这个路径来引用

    //测试用例接口
    //FactorialTest 测试用例名称, Negative 测试名称
    TEST(FactorialTest, Negative) {
    EXPECT_EQ(1, Factorial(-5)); //检查目标是输出是否与期望一致
    EXPECT_EQ(1, Factorial(-1)); //检查目标是输出是否与期望一致
    EXPECT_TRUE(Factorial(-10) > 0); //按范围来检查,为TRUE就通过,FALSH 就不通过
    }

    TEST(FactorialTest, Zero) {
    EXPECT_EQ(1, Factorial(0));
    }

    TEST(FactorialTest, Positive) {
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
    }


    TEST(IsPrimeTest, Negative) {
    EXPECT_FALSE(IsPrime(-1));
    EXPECT_FALSE(IsPrime(-2));
    EXPECT_FALSE(IsPrime(INT_MIN));
    }

    TEST(IsPrimeTest, Trivial) {
    EXPECT_FALSE(IsPrime(0));
    EXPECT_FALSE(IsPrime(1));
    EXPECT_TRUE(IsPrime(2));
    EXPECT_TRUE(IsPrime(3));
    }

    TEST(IsPrimeTest, Positive) {
    EXPECT_FALSE(IsPrime(4));
    EXPECT_TRUE(IsPrime(5));
    EXPECT_FALSE(IsPrime(6));
    EXPECT_TRUE(IsPrime(23));
    }

    3.运行测试

    a)运行测试,打开终端,先cd "/user/{user}/utest/src"
    b)再运行 sh run.h 就会产生一个测试结果报告

    4.测试报告
    测试报告放在run.sh的的输出重定向位置,run.sh脚本是直接在控制如显示的,运行结果会在控制台中输出

    ===========start test============
    [==========] Running 13 tests from 4 test cases.
    [----------] Global test environment set-up.
    [----------] 3 tests from FactorialTest
    [ RUN ] FactorialTest.Negative
    [ OK ] FactorialTest.Negative (0 ms)
    [ RUN ] FactorialTest.Zero
    [ OK ] FactorialTest.Zero (0 ms)
    [ RUN ] FactorialTest.Positive
    [ OK ] FactorialTest.Positive (0 ms)
    [----------] 3 tests from FactorialTest (0 ms total)

    [----------] 3 tests from IsPrimeTest
    [ RUN ] IsPrimeTest.Negative
    [ OK ] IsPrimeTest.Negative (0 ms)
    [ RUN ] IsPrimeTest.Trivial
    [ OK ] IsPrimeTest.Trivial (0 ms)
    [ RUN ] IsPrimeTest.Positive
    [ OK ] IsPrimeTest.Positive (0 ms)
    [----------] 3 tests from IsPrimeTest (0 ms total)

    [----------] 4 tests from MyString
    [ RUN ] MyString.DefaultConstructor
    [ OK ] MyString.DefaultConstructor (0 ms)
    [ RUN ] MyString.ConstructorFromCString
    [ OK ] MyString.ConstructorFromCString (0 ms)
    [ RUN ] MyString.CopyConstructor
    [ OK ] MyString.CopyConstructor (0 ms)
    [ RUN ] MyString.Set
    [ OK ] MyString.Set (0 ms)
    [----------] 4 tests from MyString (0 ms total)

    [----------] 3 tests from QueueTest
    [ RUN ] QueueTest.DefaultConstructor
    [ OK ] QueueTest.DefaultConstructor (0 ms)
    [ RUN ] QueueTest.Dequeue
    [ OK ] QueueTest.Dequeue (0 ms)
    [ RUN ] QueueTest.Map
    [ OK ] QueueTest.Map (0 ms)
    [----------] 3 tests from QueueTest (0 ms total)

    [----------] Global test environment tear-down
    [==========] 13 tests from 4 test cases ran. (0 ms total)
    [ PASSED ] 13 tests.


    5.mac下的完整包请看附件【请通过邮箱 索要czjone@126.com】

  • 相关阅读:
    slua
    Lua和.Net
    Python Embedded
    vtk
    CMAKE使用
    Create instance from class name string
    SLN & PROJ
    Python/C API
    魔兽世界编年史卷一
    PyCharm注册码
  • 原文地址:https://www.cnblogs.com/czjone/p/3296761.html
Copyright © 2011-2022 走看看