在接到产品需求进行开发前,怎么样才能最大程度的降低开发错误或明显bug的情况?

答案是在「开发前做设计」。

通常,一个功能的设计要包含几个方面:

  • 1.已有功能情况
  • 2.需求情况
  • 3.数据库设计
  • 4.接口设计(包括request与response字段设计)
  • 5.流程图
  • 6.类图

已有功能情况

很多需求通常是在当前系统已有的功能上添加新的功能,此时弄清楚当前系统已有功能的情况就很重要,你需要了解这些功能对应的后端接口,以及代码大致的逻辑。

从代码层面理解了已有功能后,再去从第一视角去体验产品,因为我本身不太熟悉公司产品,所以这个阶段我通常会找测试同学或产品同学先跟我演示一下功能的完成流程,然后再去抓包看接口的参数情况。

如果已有功能很复杂,此时可以利用抓包软件代理转发的功能,将系统原本发送到服务器的数据转发到自己的计算机上,自己再本地运行服务,下断点,看业务具体的逻辑,此时会非常清晰。

我通常用「Charles」进行抓包和代理转发。

以转发APP请求为例,手机与计算机需要连接相同的wifi,然后在手机wifi处,设置wifi的代理,通常在高级设置那里,将代理的ip设置成计算机的ip,端口设置成Charles监听的端口,默认为8888。

如果手机访问的https协议的接口,那么还需要安装Charles提供的证书,可以自行Google,不多赘述。

连接上后,选择Tools->Map Remote Settings,然后点击Add进行添加则可,如下图。

注意要勾选「Preserve host in header fields」。

至此,APP中所有请求某个URL的数据都会转发到你本地服务的7777端口,只要你的服务启动的也是7777端口,那么就可以接收到相应的数据了。

需求情况

产品写需求时,无论写的多细,都会有信息损失,信噪比一直都存在,就算你完全理解了他的文档,依旧可能会实现错某些功能,因为产品可能会将他的一些默认理解认为也是你的默认理解。

为了最大限度的避免这种情况,好的方式就是用自己的话从技术角度再复述一遍,写在设计中,例如这些需要要实现的功能是1、2、3,功能1需要xxx接口需要从xxx表查询xxx关键数据等,目的是整理出实现的大致想法。

如果有预期效果图,最好将效果图中与该功能对应的部分截图放置在一起说明。

整理完后,与产品同学对一下,看看会不会有较大的偏差。

数据库设计

所有的业务功能简化来看就是对数据库的CRUD,所有数据库的设计非常关键,在这一步,你需要理清晰,当前的功能是否需要新增表、是否需要在原有表中新增字段、原有字段的含义变动一下是否可以满足需求等等。

我通常会将当前已有的相关表通过Create SQL列出来,然后将需要创建的新表或需要添加字段的表单独的通过SQL列出来。

随后就是通过数据库图的形式将当前功能涉及的表、表中的字段与相互之间的关系绘制出来。

非常不建议使用http://draw.io这类可视化软件来绘制,效率极低且每个人绘制的习惯不同,出来的图并不统一,难以形成文档沉淀。

这里推荐大家使用「mermaid」,算是一种DSL(领域特定语言),利用mermaid,在Markdown上就可以绘制出美观的数据库关系图。

mermaid本身是开源的,它可以绘制各种图,如类图、UML图等等,可以阅读它的文档:「https://mermaid-js.github.io/mermaid/#/」,几乎不用花精力学新的语法,照猫画虎的用就好了。

你可以访问「https://mermaid-js.github.io/mermaid-live-editor/」在线体验一下。

此外,vscode直接安装mermaid相应的插件,便可以在使用vscode写Markdown文件时,直接绘制了。

这里简单的用Mermaid绘制了数据库关系图(通过类图的形式绘制的)

其他设计

数据库设计完后,还要进行接口设计、流程图和类图设计,这些图都可以通过mermaid绘制。

所谓接口设计,就是你这个功能,要通过什么方法请求哪个接口,请求时需要哪些参数,这个接口会返回哪些操作。

有点像与前端对接的文档,但意义不同,接口设计的目的是帮助你理清,你需要哪些字段,这些字段怎么来,之前的数据库设计是否可以轻松拿到这些值,如果不行,你可能就需要调整一下数据库设计了,后续开发时,按照接口设计定义接口则可。

流程图简而言之就是整个功能其数据的流动,比如列表数据请求哪个服务的哪个接口可以获得,它可以帮助你理清是否漏了某些功能没有设计出相应的接口或数据表。

类图通常是上述所有设计都弄完后才开始设计的,主要的目的就是定义好类的名称、类所拥有的属性和方法,通常类图定下后,这个需求的功能要如何实现,你已经很清晰了。

结尾

做设计需要花费很多时间,但其实很值得。一开始就写代码,很有可能出现的情况就是漏实现了某些细节、容易出现bug或者最严重的返工,做设计可以很大程度的避免这些情况。

此外,还可以加强程序的健壮性,比如,在设计里单独设一栏,写例外情况的考虑,针对你做的功能,针对你当前做的这个设计,是否存在某些例外情况,比如线上数据量很大,你的设计在测试环境没问题,但一上线,接口就变得很慢,比如是否可能会被别有用心之人钻空子等等。

做完这些设计后,再与产品聊一次,然后与组长讨论设计中的实现方式,看看是否有不合理之处。

在写代码前,考虑全面些,在写代码时,就不用东改一下西改一下,除了提前设计,你还可以提前写好单元测试,对于你能想到的各种可能出现的情况,都写好单元测试,然后再开始功能的开发,所谓测试驱动开发就是如此,这样能进一步减少上线时出问题的可能,但可惜的是,很多公司只求快,步子快,当然就没有那么稳。

LP1-5:测试设计的更多相关文章

  1. 云计算PAAS平台测试设计之镜像管理

    下面是云计算PAAS平台页面概览: 今天我们要讲的是镜像管理页面的测试设计: 可以看到,这个页面主要有增删改查四个功能. 1. 查询镜像 (1)易用性:查看镜像查询界面,界面上各组件设计合理.美观.易 ...

  2. H5介绍与测试设计

    近期的项目中接触的基本都为H5的测试工作,从项目初期评审到测试工作的完成过程中,遇到了很多问题是与APP测试方法不太相同的地方,在此希望总结测试过程遇到的问题及新思路给之后会接触到H5测试的同学. 这 ...

  3. MBIST:用于嵌入式存储器的可测试设计技术

    MBist技术可以自动实现存储器单元或阵列的RTL级内建自测试电路,MBIST的EDA工具支持多种测试算法的自动实现,可针对一个或多个内嵌存储器自动创建BIST逻辑,并完成BIST逻辑与存储器的连接, ...

  4. 揭开华为云CodeArts TestPlan启发式测试设计神秘面纱!

    摘要:质量是产品的生死线. 本文分享自华为云社区<揭开华为云CodeArts TestPlan启发式测试设计神秘面纱!>,作者:华为云PaaS服务小智 . 2019年12月20日,是美国波 ...

  5. 测试思想-测试设计 史上最详细测试用例设计实践总结 Part2

    史上最详细测试用例设计实践总结 by:授客 QQ:1033553122 -------------------------接 Part1-------------------------- 方法:这里 ...

  6. 【Selenium-WebDriver自学】Selenium测试设计技术(十三)

    Selenium页面对象模型 1.Selenium页面对象模型 优点 页面的对象模型是其中测试对象和功能被彼此分开,从而保持代码干净的实现. 对象保持独立的测试脚本.一个目的可以通过一个或多个测试脚本 ...

  7. 【测试设计】基于正交法的测试用例设计工具--PICT

    前言 我们都知道成对组合覆盖是一种非常有效的测试用例设计方法,但是实际工作过程中当成对组合量太大,我们往往很难做到有效的用例覆盖. PICT是微软公司出品的一款成对组合命令行生成工具,它很好的解决了上 ...

  8. 【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?

    原文链接:http://www.51testing.com/html/49/n-3721249.html 前言 当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?loc ...

  9. 【测试设计】使用jenkins 插件Allure生成漂亮的自动化测试报告

    前言 以前做自动化测试的时候一直用的HTMLTestRunner来生成测试报告,后来也尝试过用Python的PyH模块自己构建测试报告,在后来看到了RobotFramework的测试报告,感觉之前用的 ...

  10. TDD:代码可测试设计

    1  方法内部代码命令,查询分离. a . 命令方法:执行一系列动作. b.  查询方法: 执行查询动作,并返回值. 2  一个类中有好几个地方都用到了一个或多个全局变量,可以考虑把全局变量封装到另外 ...

随机推荐

  1. APIO2022 游记

    Day 0 有人刚登记完房间就把房卡落在房间里了我不说是谁(真不是我,不信去问jth) 下午把gen把模拟赛的题补了一下,T3是个不太可做的虚树上淀粉质dp,先咕着. Day 1 上午来的比较晚,没有 ...

  2. CLISP学习(二)

    它是一门函数式语言,你要用函数的思维来思考. 只不过与数学的表达不同的是,数学里的函数是在括号外  f(x) ,而lisp是在括号内,以列表的形式(f x), cos(x) --> (cos x ...

  3. 3xx HTTP状态码的终极指南

    前言 如果你在管理一些网站,那么对HTTP重定向的理解对于可靠的网站性能至关重要.在这篇文章中,我们将全面了解一下3xx HTTP状态码,从这里你可以了解它们是如何工作的,如何更好地管理它们,以及它们 ...

  4. Java基础篇——常用类

    Objec类 Test t1 = new Test(); Test t2 = new Test(); //toString方法,对某个对象的字符串输出 //getClass方法,返回该对象的Class ...

  5. 1.【窗口组件】小部件-QWidgt

    一.前言 QWidget翻译过来是小部件的意思,QWidgt 类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗 口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部 ...

  6. 字符编码和字符集-FileReader读取jbk格式的文件

    字符编码和字符集 字符编码 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果.按照某种规则,将字符存储到计算机中,称为编码.反之,将 ...

  7. MySQL-数据库、MySQL

    1.存取数据的演变史 1.文本文件: 文件路径不固定(导致代码兼容性下降) 数据格式不统一:(max|123, max_123) 2.软件开发目录规范: 1.规定了数据应该保存在db目录下>&g ...

  8. 从 Newtonsoft.Json 迁移到 System.Text.Json

    一.写在前面 System.Text.Json 是 .NET Core 3 及以上版本内置的 Json 序列化组件,刚推出的时候经常看到踩各种坑的吐槽,现在经过几个版本的迭代优化,提升了易用性,修复了 ...

  9. Session和Shiro的Session区别

    tomcat中的session常出现为jsessionId,而shiro的session不相同,两者的id不同. 在controller中,通过 request.getSession(_) 获取会话 ...

  10. C++练习2 强制类型转换

    const可以把有关的数据定义为常量. const类型可以修饰:对象,指针,引用 使用const_cast为强制类型转换,将常量强制转换非常量. 1 #include <iostream> ...