博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
概率性的bug比较恼人(软件质量不是一句废话)
阅读量:4141 次
发布时间:2019-05-25

本文共 1699 字,大约阅读时间需要 5 分钟。

       在软件开发中, 必现的bug比较好定位修改, 但是概率性的bug有时就很难搞定了。

       测试组的MM提出一个概率低于1%左右的bug偷笑, 真不知道她们是怎么确定的。  要解决, 咋办?  首先, 要定位, 因此至少要重复100次左右的操作, 假设运气好, 复现了, 那好, 看日志。 晕, 竟然没有记录的日志。  所以只能加日志, 重新编译, 把新版本刷进去, 继续重现。 又要搞100次左右。  假设运气好, 重现了。 好, 分析日志, 假设运气好, 日志中刚好有记录信息。 现在你要分析日志啊, 要定位啊, 要修改啊。 修改后,重新编译, 再把版本刷进去。 可别高兴太早, 还要进行改后的测试呢, 至少要重复100次吧, 到100次后, 发现没有出现问题。 这个时候, 你仍无法判断是原来那个bug没有出现, 还是修改后才没有出现的。 所以要继续测试100次左右。 假设运气好, 还没有出现, 这个时候, 你仍然不能肯定自己修改好了。 没办法, 只能提交修改单。 

       然后测试的MM继续测试, 假设运气好, 那个问题确实修改好了, 那还算ok, 假设测试MM测试的时候又重现了, 把你叫过去, 你能咋办? 哭吧大哭! 

 

       软件开发的成本就类似于这样。 一般而言, 概率性的bug多数是由于程序猿考虑不周全造成的, 所以严密的逻辑思维和良好的程序风格是多么重要啊。 

 

       下面来看一个例子:

 

#include 
#include
#define MAX_CHAR_VALUE 127#define MAX_MSG_LEN 100#define LEN 24using namespace std;int main(){ // 客户端 unsigned char head[LEN + 1] = {0}; int i = 0; srand(time(NULL)); for(i = 0; i < LEN; i++) { int randNum = rand(); head[i] = randNum % (MAX_CHAR_VALUE + 1); } char message[MAX_MSG_LEN + 1] = {0}; _snprintf(message, sizeof(message) - 1, "%s%s", head, "xxx"); // 服务端会对head长度进行校验 return 0;}

     

 

        上程序中, 模拟客户端给服务端发送消息, 服务端校验了消息头的长度。 容易知道, 上述程序可能会出概率性bug, 改为如下比较好:

 

#include 
#include
#define MAX_CHAR_VALUE 127#define MAX_MSG_LEN 100#define LEN 24using namespace std;int main(){ // 客户端 unsigned char head[LEN + 1] = {0}; int i = 0; srand(time(NULL)); for(i = 0; i < LEN; i++) { int randNum = rand(); head[i] = randNum % (MAX_CHAR_VALUE + 1); if(0 == head[i]) { head[i]++; } } char message[MAX_MSG_LEN + 1] = {0}; _snprintf(message, sizeof(message) - 1, "%s%s", head, "reset"); // 服务端会对head长度进行校验 return 0;}

 

        不多说。

 

 

        现在这个年代, 手机不常关机的人很多, 假设一个手机连续运行一个星期后, 会死机一次, 作为用户, 你肯定会抱怨。 作为开发人员, 遇到这种问题,要定位分析并修改并自测试, 也是相当头疼的事情。 所以软件质量, 真的不是一句废话。

       

 

 

       习惯会改变人的一生。 你要好的, 还是坏的, 习惯?

 

 

 

转载地址:http://aarvi.baihongyu.com/

你可能感兴趣的文章
java 8list去重
查看>>
Git从入门到放弃
查看>>
java8采用stream对集合的常用操作
查看>>
每天一个SpringBoot注解之@Qualifier
查看>>
自己Mybatis的复习整合
查看>>
自己的Spring复习
查看>>
自己Springmvc复习(一)springmvc基础
查看>>
自己的springmvc复习(二)springmvc提高
查看>>
自己的springboot的基本原理知识点梳理
查看>>
自己的springboot 2.0的基本原理知识点梳理
查看>>
自己的springboot 2.0的零散知识梳理
查看>>
原生ajax和JQuery实现异步对注册姓名的校验
查看>>
shiro权限管理基本原理和实现的整理
查看>>
阿里巴巴开发手册笔记-----数据库篇
查看>>
JUC组件拓展
查看>>
多线程并发最佳实践
查看>>
Mysql体系架构以及执行过程
查看>>
mybatis简介及框架设计
查看>>
mybatis的原理
查看>>
mybatis入门及配置解析
查看>>