zoukankan      html  css  js  c++  java
  • 在Codeblocks下配置GoogleTest单元测试工具

    开发工具

    我和我的组员的都是使用的是大一老师推荐的codeblocks,所以,就愉快的决定了工具统一为codeblocks,语言C++。

    测试单元

    老师推荐的是JUnit和VSTS工具,但同学们从大一到现在最熟悉的还是codeblocks编程软件。既然的其他编程软件能加载测试工具,我想,codeblocks也行,百度后发现googleTest支持codeblocks(我就说会有的。。)。那么接下来,是具体的配置过程。

    工具下载

    1. googleTest官网上最新版为1.8.0版本的,但我试了并不能成功Build,所以我这里给出1.7版本的。这里还需要下载cMake用来生成cbp文件让codeBlocks识别。

    工具下载地址:

    https://pan.baidu.com/s/1uSu_TioPFOal6MYdM5Zp5A
    

    2.分别解压两个文件后,进入cmake文件夹的bin下,运行cmake-gui。

    在“where is the source code”中选择解压后的googletest文件路径,如我的路径为 C:/Users/Administrator/Desktop/googletest-release-1.7.0/googletest-release-1.7.0 ,

    然后在“where to build the binaries ”可选择在解压路径下新建的一个文件夹路径,如,我在googletest-release-1.7.0/下新建了一个“codeblocks-mingw”文件夹,所以路径为

    C:/Users/Administrator/Desktop/googletest-release-1.7.0/googletest-release-1.7.0/codeblocks-mingw

    3. 然后点击Configure按钮,选择 codeblocks-MinGw Makefs,选择Use default native compiler,再点击Finish

    4. 回到主界面配置完成后勾选 gtest_disable_pthreads,再点击Generate。

    4.去到刚刚新建的codeblocks-mingw文件夹下,找到生成的gtest.cbp文件,双击就可进入codebloks中,然后点击齿轮按钮build成功即可。



    配置codeblocks:

    既想用C++11的新特征,又想顺利编译Google Test,你得用命令行参数-std=gnu++11,而不是-std=c++11。

    1. 用codeblocks新建一个工程**

    右键project,选择Build options...清除Compiler settings > Compile Flags下与-std=有关的复选框点击选项卡Compiler settings > Other options,在对话框中填写-std=gnu++11

    (如果没有使用c++11新特性,上面两步可以省略)
    在Linker settings > Other linker options下填写-lgtest
    点击OK

    2. 点击选项卡Search directories**

    在Compiler子选项卡中Add一项,填写解压后的googleTest下的include文件夹路径,如我的为 C:UsersAdministratorDesktopgoogletest-release-1.7.0googletest-release-1.7.0include

    在Linker子选项卡中Add一项,填写新建的文件夹路径,我的为 C:UsersAdministratorDesktopgoogletest-release-1.7.0googletest-release-1.7.0codeblocks-mingw

    3. 点击OK



    单元测试

    然后我们可以新建工程测试自己的代码了。记得加上必要的头文件。面是我测试自己写的判断五子棋输赢的函数的结果

    
    
    #include <iostream>
    #include<cstdio>
    #include<gtest/gtest.h>
    #define WIN_Flag 100;
    #define INTERUPT -100;
    using namespace std;
     int ac[10][10]={   {0,0,1,0,0,0,0,0,0,0},         //0
                   {0,0,-1,1,0,0,0,0,0,0},        //1
                   {0,0,0,1,1,0,0,0,0,0},        //2
                   {0,0,0,0,-1,-1,0,0,0,0},       //3
                   {0,0,0,0,1,-1,0,0,0,0},        //4
                   {0,0,0,1,0,1,-1,0,0,0},        //5
                   {0,0,1,0,0,-1,0,0,0,0},
                   {0,1,0,0,0,-1,0,0,0,0},
                   {1,0,0,0,0,0,0,0,0,0},
                   {0,0,0,0,0,0,0,0,0,0}};
    
                // 0 1 2 3 4 5 6 7 8 9
    
    int a[10][10]={0,0,1,0,0,0,0,0,0,0,         //0
                   0,0,-1,1,0,0,0,0,0,0,        //1
                   0,0,0,-1,1,0,0,0,0,0,        //2
                   0,0,0,0,-1,-1,0,0,0,0,       //3
                   0,0,0,0,0,-1,0,0,0,0,        //4
                   0,0,0,0,0,1,-1,0,0,0,        //5
                   0,0,0,0,0,-1,0,0,0,0,
                   0,0,0,0,0,-1,0,0,0,0,
                   0,0,0,0,0,0,0,0,0,0,
                   0,0,0,0,0,0,0,0,0,0};
    
    
    
    
    int CheckLine(int a[10][10],int i,int j,int direction ,int key,int& value)
    {static int counter=1;
    if(i>=0&&i<10&&j>=0&&j<10)
       {
    
      counter++;
        cout<<counter<<endl;
        if(counter==1)
            switch(direction)
            {
            case 3:
                if(j>=2&&key*a[i][j-2]<0)
                    value--;break;
            case 4:
                if(i>=2&&j>=2&&key*a[i-2][j-2]<0)
                    value--;break;
            case 5:
                if(i>=2&&key*a[i-2][j]<0)
                    value--;break;
            }
        if(counter==5)
           {
               if(key>0)
                a[i][j]=direction;
               else a[i][j]=-1*direction;
               counter=1;
               return WIN_Flag;
           }
        if(key*a[i][j]>0)
        {
            switch(direction)
            {
                case 3:if(key>0) a[i][j]=direction;
                        else a[i][j]=-1*direction;
                    CheckLine(a,i,j+1,3,key,value);break;
                case 4:if(key>0) a[i][j]=direction;
                        else a[i][j]=-1*direction;
                    CheckLine(a,i+1,j+1,4,key,value);break;
                case 5:if(key>0) a[i][j]=direction;
                        else a[i][j]=-1*direction;
                    CheckLine(a,i+1,j,5,key,value);break;
                case 6:if(key>0) a[i][j]=direction;
                        else a[i][j]=-1*direction;
                    CheckLine(a,i+1,j-1,6,key,value);break;
    
            }
        }
        else {value--;
        counter=1;
        return INTERUPT;}
    
       }
    
    
     }
    
    
    int FlagToWin(int a[10][10])
    {   int i,j,value=2;
    
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
        {
            switch(a[i][j])
            {
                case 1: case -1: if(CheckLine(a,i,j+1,3,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j+1,4,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j,5,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j-1,6,a[i][j],value)==100)
                                    goto loop;
                                break;
                case 3: case -3: if(CheckLine(a,i+1,j+1,4,a[i][j],value)==100)
                                    goto loop;
                                 if(CheckLine(a,i+1,j,5,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j-1,6,a[i][j],value)==100)
                                    goto loop;
                                break;
                case 4: case -4:if(CheckLine(a,i,j+1,3,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j,5,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j-1,6,a[i][j],value)==100)
                                    goto loop;
                                break;
                case 5: case -5:if(CheckLine(a,i,j+1,3,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j+1,4,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j-1,6,a[i][j],value)==100)
                                    goto loop;
                                break;
                case 6: case -6: if(CheckLine(a,i,j+1,3,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j+1,4,a[i][j],value)==100)
                                    goto loop;
                                if(CheckLine(a,i+1,j,5,a[i][j],value)==100)
                                    goto loop;
                                break;
            }
        }
        loop:
    
    for(int p=0;p<10;p++)
        {for(int q=0;q<10;q++)
                    if(a[p][q]<0) cout<<"* ";
                    else if(a[p][q]>0) cout<<"2 ";
                    else cout<<"0 ";
            cout<<endl;
        }
    if(i<10&&j<10&&a[i][j]<0)
       {
        i=0;
        cout<<"—————————THE Black IS The WINNER!!!——————————————"<<endl;
       }
    else  if(i<10&&j<10&&a[i][j]>0)
            {i=1;
            cout<<"—————————THE White IS The WINNER!!!——————————————"<<endl;
            }
    return i;
    }
    TEST (FlagToWin,HandleNoneZeroInput)
    {
        EXPECT_EQ(1,FlagToWin(ac));//输出为1 白棋赢
        EXPECT_EQ(0,FlagToWin(a));//输出为0 黑棋赢
        EXPECT_EQ(1,FlagToWin(a));  //错误参数测试
    
    }
    int main(int argc, char *argv[]){
    
        testing::InitGoogleTest(&argc,argv);
        return RUN_ALL_TESTS();
        cout<<FlagToWin(a);
        return 0;
    }
    

    这段代码可看到我共写了三个测试案例,其中两个正确,一个错误。

    其中,

            EXCPECT_*  为失败时,案例继续往下执行;
            ASSERT_*   为失败时,直接在当前函数中返回。
    

    “testing::InitGoogleTest(&argc, argv);” :gtest的测试案例允许接收一系列的命令行参数,因此,我们将命令行参数传递给gtest,进行一些初始化操作。gtest的命令行参数非常丰富,在后面我们也会详细了解到。

    “RUN_ALL_TESTS()” :运行所有测试案例

    截图为函数测试结果,绿色表示测试案例通过,错误案列情况由红色文本提示.

    参考博客

    :http://www.cnblogs.com/TenosDoIt/p/3412721.html

    http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html

  • 相关阅读:
    TP-LINK,TL-WR885路由器无线桥接方法
    python3 urllib.request.Request的用法
    requests模块
    python3中引入扩展包时的几个注意事项
    Flask-sqlacodegen之ORM操作
    mysql ERROR 1049 (42000): Unknown database '******' ”错误处理办法
    Python各种包下载路径
    python在Apache中的部署
    Python3 基于 Nginx或Apache 部署 Django 项目
    Python如何发布程序
  • 原文地址:https://www.cnblogs.com/firstblogtoliukehong/p/8604243.html
Copyright © 2011-2022 走看看