在接到产品需求进行开发前,怎么样才能最大程度的降低开发错误或明显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. 通过Terraform创建GCP Pubsub

    1 简介 Terraform是管理许多平台的基础设施的工具,如AWS.GCP和Azure.这篇文章将讲解如何通过Terraform来管理GCP Pub/Sub. 创建GCP项目请参考:初始化一个GCP ...

  2. 【Java刷题】初始化List应该选择ArrayList还是LinkedList

    文章目录 前言 题目 解题思路 遇到的坑:ArrayList和LinkedList 未通过代码 通过代码 小结 ArrayList和LinkedList的区别 在刷题的时候应该如何选择 排序效率 测试 ...

  3. 编程思想转换-Lambda表达式

    编程思想转换 做什么,而不是怎么做 我们真的希望创建一个匿名内部类对象吗?不.我们只是为了做这件事情而不得不创建一个对象.我们真正希望做的事情是︰将run方法体内的代码传递给 Thread类知晓. 传 ...

  4. Python 异步集群使用

    目前在做Python项目用到同步和异步的方法使用Redis单机,现在要增加兼容Redis集群.也就说当前项目用到中以下4种Python使用Redis的方法都用到了. - 同步 异步 单机 涉及 涉及 ...

  5. 使用 NineData 实现备份集的实时查询

    使用 NineData 实现备份集的实时查询 背景信息 数据作为一家公司的重要资产,其重要程度不言而喻.数据库为数据提供存取服务,担任着重要的角色,如果因数据误删.服务器故障.病毒入侵等原因导致数据丢 ...

  6. 【随笔记】NDK 编译开源库 jsoncpp

    下载并解压源码 wget https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.4.tar.gz -O jsoncp ...

  7. 【学习笔记】C++ 常量折叠原理和验证

    以下的代码很有意思,在相同时刻,相同的内存地址,数据居然会不一样. #include <iostream> int main(void) { const int const_val = 3 ...

  8. Docker修改已有容器的端口映射

    Docker修改已有容器的端口映射 背景 拉取了jenkins的镜像,启动容器的时候端口就映射了8080,但这个演示环境要用到jenkins node,其中默认的代理端口是50000.漏了,就想着能否 ...

  9. 虚拟机配置代理(虚拟机nat)

    桥接 ​ 第一步:打开clash allow lan ​ 第二步:找到宿主机在局域网中的IP地址 ​ 第三步:配置虚拟机代理 NAT ​ 同上 注意 ​ 一.宿主机防火墙要配置好(直接关闭会也有效果, ...

  10. 强大的word插件,让工作更高效:不坑盒子 2023版

    不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理,如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件,这是一个非常好用的插件工具,专门应用在Word文档中,支持Office ...