• 程序员晋升必备技能——单元测试框架(小豆君的干货铺)


    可能每个程序员都面临着这样一种困境:由于客户总是无法用非常清晰的语言来描述需求,他们自身其实也并不完全清楚自己真正想要的是什么,而且即使你已经具备足够的业务知识和背景,为用户提供了全面的解决方案。但对于软件的需求,也会因各种原因而不断变更,所以作为程序员就需要为这些变更做好准备。

    另一个促使程序员修改代码的动力,往往来自他们自身,不是每个程序员一上来就可以编写完美高效的代码,技艺超群的程序员总会不断地重构代码。而每一次重构就会面临着在已有测试通过的功能点上再次引入bug。

    所以,针对以上的种种情况,搭建一个自动化测试框架就显得尤为重要。而且这也是作为程序员的你迈向高级的必备技能之一。

    在开始编码之前,先编写测试框架,这往往会比直接写代码会更快。为什么这么说,就我个人体验,测试框架会帮助你整理思路,注意到被测试类的边界条件,适用范围等一些敏感区域,从而使整个类更加健壮,被证明为错误的几率也大大减小。而且,这也比先写完代码再测试来的更有效。从某种意义上说,这也是一种注意力上的分工。

    接下来小豆君跟大家分享一个简单的测试框架,也是达到一个抛砖引玉的目的,欢迎大家积极讨论和提意见。

    下面是一个超市商品的例子,该类很简单,旨在说明编写测试框架的步骤及方法。

    1 第一步:编写类声明

    新建一个空工程,命名为SimpleTest。

    向工程中添加一个头文件commodity.h

    commodity.h

    #ifndef COMMODITY_H
    #define COMMODITY_H
    #include <string>
    using std::string;
    
    
    class Commodity
    {
    public:
        Commodity(const string& serialNum,
                  const string& name,
                  double consting,
                  double price);
        //获取商品编号
        string serialNum() const;
        //获取商品名称
        string name() const;
        //获取商品成本
        double consting() const;
        //获取商品价格
        double price() const;
        //修改商品价格
        void setPrice(double price);
        //获取单个商品利润
        double profit() const;
    private:
        string m_serialNum;//商品编号
        string m_name;     //商品名称
        double m_consting; //商品成本
        double m_price;    //商品价格
    };
    #endif // COMMODITY_H
    

    代码很简单,我就不解释了。

    2 第二步:编写测试代码

    添加main.cpp文件

    #include <iostream>
    #include "commodity.h"
    using std::cout;
    
    
    int cntPass = 0;
    int cntFail = 0;
    void test(bool b)
    {
        if (b)
            ++cntPass;
        else
            ++cntFail;
    }
    int main(int argc, char *argv[])
    {
        //啤酒,成本4块卖5块
        Commodity c("beer_1", "啤酒", 4, 5);
        test(c.serialNum() == "beer_1");
        test(c.name()      == "啤酒");
        test(c.consting()  == 4);
        test(c.price()     == 5);
        test(c.profit()    == 1);
    
    
        cout << "cntPass:" << cntPass << "
    cntFail:" << cntFail;
    }
    


    在这里我创建了两个全局变量,cntPass和cntFail,分别表示测试通过数和测试失败数。最后将这两个变量打印出来。

    3 第三步:实现类

    实现Commodity类

    commodity.cpp

    #include "commodity.h"
    Commodity::Commodity(const string &serialNum,
                         const string &name,
                         double consting,
                         double price)
    {
        m_serialNum = serialNum;
        m_name = name;
        m_consting = consting;
        setPrice(price);
    }
    string Commodity::serialNum() const
    {
        return m_serialNum;
    }
    string Commodity::name() const
    {
        return m_name;
    }
    double Commodity::consting() const
    {
        return m_consting;
    }
    double Commodity::price() const
    {
        return m_price;
    }
    void Commodity::setPrice(double price)
    {
        m_price = price;
    }
    double Commodity::profit() const
    {
        return price()-consting();
    }
    

    最后编译运行该测试程序

    测试全部通过。

    关于test测试接口,还可以在其中打印更多的辅助信息,这就有赖于各位朋友的需求来扩展测试代码了。

    通过以上的介绍,相信各位朋友对测试框架有了一定的了解,其基本的思想就是“类声明——测试代码——实现类——执行测试”。C++中也提供了一些测试工具,例如CppUnit等,感兴趣的同学可以去了解一下。

    在下一篇文章,小豆君将分享Qt提供的测试框架,敬请期待吧。

    更多分享请关注微信公众号:小豆君Qt分享,只要关注,便可加入C++Qt交流群,一起学习,更可获得所有文章源码。

    https://zhuanlan.zhihu.com/p/38486291

  • 相关阅读:
    Linux
    Linux
    JavaScript
    JavaScript
    Linux
    不可不说的Java“锁”事
    RabbitMQ公共配置
    求一个数字的补码
    项目中Controller的全局异常处理类
    如何较方便给上百张数据库表添加表字段
  • 原文地址:https://www.cnblogs.com/findumars/p/9231722.html
Copyright © 2020-2023  润新知