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

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

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

原文地址:https://www.cnblogs.com/findumars/p/9231722.html

时间: 2024-08-02 02:49:02

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

【软帝学院】七点java程序员进阶必备技能

程序员进阶很慢?七点java程序员进阶必备技能,让你少走弯路 一.架构师筑基必备技能 阿里面试更多的内容是架构师基础内容,比如并发编程的AQS.CAS等,多纬度提升架构基础,并发编程高级进阶,JVM性能深度调优,网络编程与高效IO,深入Tomcat底层,Mysql深度优化实战,架构师必备Linux 二.分布式方案及团队协作工具 分布式环境下应该知道的分布式系列问题: 分布式事物解决方案 单点登录解决方案 分布式任务调试解决方案 Maven企业级实战 Jenkins分布式构建实战 Git版本管理

Git算不算程序员的必备技能?

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书. --异步小编 Git的背后有着一个非常精彩的成功故事.2005年4月,Linus Torvalds因不满当时任何一个可用的开源版本控制系统,就亲自着手实现了Git. 时至今日,如果我们在Google中搜索"git version control"这几个关键词,都会看到数以百万计的返回结果.Git已经俨然成为了新型开源项目的一个标准.许多大型的开源项目都已经或正在计划迁移到G

聊聊程序员的软技能

聊聊程序员的软技能 最近读到一本有意思的书,叫<软技能-代码之外的生存指南>,这是一本相当跨界的书,内容除了介绍了技术人的职业发展之外,还涉及了自我的营销.学习方法.生产力.健身.甚至还包括理财.应该说,每一个章节都是非常有意思的,值得每一个程序员学习的内容. <软技能>一书的内容分为以上这些章节,我也按这些章节讲讲自己的感悟吧. 职业 职业一章介绍了程序员的面试,晋升,离职,远程办公,自由职业,以及创业.不管做什么事情,专业性总是第一要点.就像书中写的那样,我们应该成为「专业人士

技术才是王道、程序员修炼必备武器

信息技术的发展时间虽然不长,但其爆炸式的发展速度使信息技术迅速覆盖社会和人类生活的各个角落.程序员们是这场信息化浪潮的见证者之一,更是其中的主要参与者,这是时代赋予每个程序员的机会和责任. 信息技术的更新速度是惊人的,程序员的职业生涯则是一个要求不断学习的过程,永远不能固步自封.本人在工作期间曾看见过很多程序员只要有闲暇时间就?浏览一些没有太大作用的网页,在网上聊天,打游戏,浪费了大量的时间,十分不可取.而另外一种情况是,IT技术的日新月异使很多程序员眼花缭乱,什么都想?学,却又不知从何学起,今

程序员Web面试之前端框架等知识

基于前面2篇博客: 程序员Web面试之jQuery 程序员Web面试之JSON 您已经可以顺利进入Web开发的大门. 但是要动手干,还需要了解一些已有的前端框架.UI套件,即要站在巨人肩膀上而不是从轮子开始造汽车. 下面就Web开发用到的前端框架.UI套件.UI插件一一列举(排名不分先后): jQuery UI jQuery UI以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件.包含了许多维持状态的小部件(Widget)

黑马程序员——类似于spring的AOP框架

BeanFactory.java的代码 package com.itAOP; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /* * 整体的工作原理是这样的: * 工厂类BeanFactory在创建目标类或代理的对象的时候,先由getBean接收一个字符串, * 然后到配置文件中查找器对应的字符串并产生器对象,如果这个对象是ProxyFactoryBean类的 * 实例对象

100+个程序员开发必备参考手册(在线及下载) [复制链接]

100+个程序员开发必备参考手册(在线及下载) [复制链接] 上一主题下一主题   离线张广巨 班长 关闭 个人中心可以申请新版勋章哦 立即申请知道了 加关注 发消息 只看楼主 倒序阅读 使用道具楼主   发表于: 2012-11-22 本部分设定了隐藏,您已回复过了,以下是隐藏的内容 即使经验丰富,天赋过人,也不得不承认,你并不能记得所有的东西,尤其是各种各样的语言的API,参考手册(Cheat Sheet)和Google肯定是必备,为了更方便的使用,也有很多有心的人收集整理了很多,比如下面这

黑马程序员——黑马基础——Map,集合框架工具类Conlections和Arrays

黑马程序员--黑马基础--Map,集合框架工具类Conlections和Arrays ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一,Map集合 Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key). 特点: 1)该集合存储键值对,一对一对往里存 2)要保证键的唯一性. Map集合的子类 Map |--Hashtable:底层是哈希表数据结构,不可以存入null键nu

为什么开源可以提高程序员的编程技能?

为什么开源可以提高程序员的编程技能? 记住开放源代码在你参与进去的时候效果最佳.代码更改在大多数项目中都是受欢迎的,但是有很多出力的方法.测试开源代码和文件错误报告:帮助完成文档集:写教程和如何做的例子:参加对话--或者仅仅只是帮助传播.每一件事都能带来改变,并且越多的人参与进来越好! 我已经写了很多年的软件.最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好.这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗? 阅读代码能让你变得更优秀 我在编程生涯的早期就明白我阅读