创建测试数据

BuildDatabase

在一些文档规范严格的公司,实际上是同时有一份开发文档和测试文档的。但开发人员在整个开发过程中,并没有参考测试文档,所以最后就很容易造成测试阶段开发人员不断地返工,开发人员和测试人员之间矛盾尖锐。但最终80%的情况,还是开发的问题,毕竟你是做事的人,人家是检查的人。所以为什么不从一开始,就把需求文档、测试文档和开发文档合其为一呢?(当然,分开写,会有一些“监督”的作用,但我始终觉得,这种监督效率不高,投入产出不划算)

 

而且我发现,这些测试文档,都有一个问题:操作繁琐不经济。

仍以“用户名不能重复”为例,我看到的测试文档大致就是这样写的:

  1. 以test-1112为用户名注册一个新用户
  2. 再使用test-1112为用户名进行注册
  3. 页面显示错误提示:用户名重复
  4. ……

表面上看起来没有问题,但是如果测试次数多了的话,就会感觉每次先去注册一个新用户很麻烦。而且,这只是最简单的功能,如果功能复杂,要求准备的数据多/难/特殊,怎么办?我们又讲一个故事吧。

 

项目上线前夕,测试人手不够,我们开发过去帮忙。我跑一个test case,跑了一个多星期!你信不信?我的问题就在于测试的这个数据做不出来。测试文档是一步步写清楚了的,但你这样做不下去:权限不够、数据已有变化、文档模糊……到处找人问。找到懂这事的人,中途又发现,程序(页面)发生了更改,有些功能跑不起来……最后一个workaround,得改数据库,数据库又得找DBA啊……总之,这个test case搞得鸡飞狗跳,好在最后还是跑出来了——但以后(下一次)怎么办, 我就不知道了。

 

本质上,这种做法,测试数据是要测试人员自己“做”,或者“找”的,有很多问题。所以,从那时开始,我就在想:能不能把测试用的数据“固化”下来?让测试人员就基本上不用“做”,或者很方便的就能“找”打测试数据。比如:“用户名不能重复”的文档就直接写成:

  1. 使用test-1112为用户名进行注册
  2. 页面显示错误提示:用户名重复

最多加一个说明:test-1112是已有用户名,用户名不能重复。

 

这个诱惑一直吸引着我,最后我在solution中就引入了一个BuildDatatase项目,专门为开发测试准备数据。毫无疑问,这个决定也遭到了开发人员的抵制。因为这个数据也不是那么好做的,具体我们将在项目详解里谈。

我铁腕推行,大概经过了两件事,他们慢慢的就习惯/认同了这种做法。

 

第一件事,是任务列表页面。开发代码之前是写好了的,而且已经跑了一段时间了。我让他为该页面重新创建测试数据,他一脸不可置信:这种筛选排序,天?要准备多少数据?!怎么准备?代码都写好了,跑得好好的,有必要吗?

我让他先冷静一下。然后有以下对话:

“如果你不准备这些数据,你怎么保证你代码的正确性?”我问。

“就直接在页面上建几个任务啊,然后跑一下。”他想了想。

“要建几个呢?”我继续追问。

“……”,他一时答不出来。

“随便做几个数据,随便的跑一跑,然后就不管了,是吧?你以前就是这样做的?”,我接着说,“所以我们的代码没有质量。然后如果没有专门的测试呢,就让用户当免费测试员;有测试呢,我们就把这些脏活累活扔给他们。他们一遍遍的报bug跑不过,我们还不服气还有怨气……为什么我们不一开始就把它做好呢?”

首先确定要做,然后再想办法!很快我们就想到了一个办法,反过来做:满足所有筛选条件的任务就一条,然后逐个的减少筛选条件,每少一个筛选条件,就增加一个适格任务。这样理下来,共计25条数据就够了,并没有我们想象的多。从构思到文档再到最后“造”完所有任务,差不多花了一个下午的时间而已。最后,戏剧性的是:出效果了!跑一遍,我们立马发现了代码里面的两个bug。因为这种query查询写代码的时候都“复制粘贴”的,十几个条件,难免出错。如果不是这样跑一次,这些bug不知道什么时候能冒出来——因为我们自己用的筛选条件比较固定的,某些筛选条件从来没用过。所以我问他:你之前说“跑得好好的”?他只能呵呵了。

 

第二件事,是在任务编辑页面,我们要测试父子任务关系之间的自动化功能,这就需要比较复杂的一个“任务树”做开发测试数据,好在我们是做了的。代码review的时候,我在我这边一跑,不对,就直接打回去了;过了一会,他跑过来,代码没问题啊?当时我们脑子都短路,没想到其他,就先去看代码去了,折腾了好久。在他电脑上跑,然后又在我电脑上跑,又是设断点,又是看逻辑。

后来我突然灵光一闪,“是不是数据的问题?”

“嗯,有可能。但怎么确定呢?”

“你重新BuildDatabase再跑!”

果不其然,原来他自己跑的时候改动了数据,然后就忘了呀,一直就在已变动的数据上跑,当然没问题了。亏得我们有BuildDatabase,可以随时重建“基准”数据,否则,这种问题是相当花冤枉时间的!

这类似的情况其实很多很多,测试人员报bug之后,我估计开发人员最常用的一句台词就是:“我这里都能跑啊?!”所以问题80%都出在数据上——那为什么我们的数据就不能规范统一起来呢?

通过BuildDatabase,建立一个有序的可控的数据库,我们才能够在此基础上进行一系列的(测试驱动的)文档编写、开发和测试活动。所以说,BuildDatabase是“测试驱动”的基石和保障。除此以外,BuildDatabase还可以在项目发布、模拟展示等方面发挥重要作用。

 

(我以前公司的集成测试环境这些,数据库都是从生产环境中copy或截取的,我们需要的数据都是“自己造”,或者“自己找”的。这样做能基本满足开发测试需要,但中间总是很容易“出篓子”——正如我前面所说,一个test case可以跑一周。而且随着数据增加,这个copy也越来越难啊,一次导几百个G终究很累,所以好像是到了一定时候,还是得自行维护测试数据库——但维护主要是数据结构上的,比如增减列之类的,数据本身是无法维护的。

我很好奇,除了我的builddatabase以外,有没有其他比较可行的办法?欢迎大家踊跃交流!)

转载于:https://www.cnblogs.com/zourui4271/p/4991615.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql最大连接数合理值_MySQL服务器最大连接数的合理设置

MySQL服务器的连接数并不是要达到最大的100%为好,还是要具体问题具体分析,下面就对MySQL服务器最大连接数的合理设置进行了详尽的分析,供您参考。我们经常会遇见“MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确…

echo off备份mysql_windows下备份Linux服务器上的MySQL

【更新】因为windows存在 10点前后生成的时间格式不同,导致无法正确生成sql文件。导致上次的备份文件无法生成研究后对旧内容进行修改echo offforfiles /p "D:\ERP_MySQLbak" /m mysql_backup_*.sql -d -2 /c "cmd /c del /f path"set/a a%time…

python 3d重建_3D点云重建原理及Pytorch实现

3D点云重建原理及Pytorch实现 Pytorch: Learning Efficient Point Cloud Generation for Dense 3D Object Reconstruction 一种Pytorch实现方法:学习高效的点云生成方法用于稠密三维物体重建 一.论文概要 传统的三维对象生成建模方法是利用三维卷积运算的…

Java进阶04 RTTI

链接地址:http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 运行时类型识别(RTTI, Run-Time Type Identification)是J…

springdatajpa命名规则_Spring Boot 之Spring data JPA简介

PA的全称是Java Persistence API (JPA),他是一个存储API的标准,而Spring data JPA就是对JPA的一种实现,可以让我们方便的对数据进行存取。按照约定好的方法命名规则写dao层接口,从而在不实现接口的情况下,实现对数据库…

PHPCMS 模板的设置

编制好模板后&#xff0c; 一、设置config.php<?php return array (name > 现代的蓝红色模板,author > dazhaihui,dirname > simpleblue,homepage > http://www.phpcms.cn/,version > 1.0,disable > 0,file_explan >array (templates|simpleblue|cont…

奖学金设计mysql_基于JAVA的奖学金评定系统设计与实现(MySQL)(含录像)

基于JAVA的奖学金评定系统设计与实现(MySQL)(含录像)(任务书,开题报告,外文翻译,毕业论文10000字,程序代码,MySQL数据库,答辩PPT,答辩视频录像)摘 要本文论述了奖学金评定系统从分析到实现的整个过程&#xff0c;说明了系统实现的基本思路&#xff0c;介绍系统不同的功能模块以…

python中的列表和元组_python中列表和元组的区别

如果有了解过python中的列表和元组&#xff0c;你可能会知道相对于列表&#xff0c;元组是不可变的&#xff0c;也就是说元组中的数据不能随意更改。除了列表是用中括号表示而元组是用小括号表示之外&#xff0c;这两种数据类型好像并没有什么不同&#xff0c;都是用来存放一系…

sublime2使用和配置

官方下载地址:http://www.sublimetext.com/2,可下载zip免安装版 显示左侧目录树 无需安装插件,菜单>“文件”》“打开目录”&#xff0c;会自动显示 代码注释 无需安装插件&#xff1a;Ctrl/&#xff1a;注释整行&#xff0c;可来回切换&#xff0c;Submlie Text可自动判断…

mysql ab复制延时_Mysql的AB复制

Mysql的AB复制环境&#xff1a;rhel 6.5master:192.168.2.1slave1:192.168.2.2slave2&#xff1a;192.168.2.101.mysql的单向复制注: mysql数据库的版本,两个数据库版本要相同,或者slave比master版本高!yum install mysql-server -y请注意当你进行复制时,所有对复制中的表的更…

python ckeditor上传图片400错误_又一款python开发神器

优秀的python开发工具有很多&#xff0c;比如pycharm&#xff0c;spder&#xff0c;ipython&#xff0c;jupyter以及很多编辑器的插件等。但是如果利用python来做数据分析的话&#xff0c;要是有一款类似Rstudio的工具就好了&#xff0c;Rstudio是非常人性化的工具。之前有一个…

mysql.data.dll win10_【MySQL】Windows10下安装

2.配置环境变量变量名&#xff1a;MYSQL_HOME变量值&#xff1a;download_path\mysql-8.0.19-winx64path添加&#xff1a;%MYSQL_HOME%\bin;3.生成data文件管理员身份&#xff0c;进入download_path\mysql-8.0.19-winx64\bin命令&#xff1a;mysqld --initialize-insecure --us…

Chrome 调试动态加载的js

今天有个同事问到我用chrome调试动态加载js的问题&#xff0c;这个问题之前遇到过&#xff0c;只是时间有点长了&#xff0c;有些忘记。在这里做一下记录&#xff1a; 在要调试的源码的后面加上 // sourceURL debug.js 注释。 这样子&#xff0c;当浏览器检测到这个标记的时候…

mysql数据库邮箱什么类型_MySQL的数据类型介绍

MySQL的数据类型介绍 发布时间:2020-06-01 20:57:09 来源:亿速云 阅读:154 作者:鸽子 由于Mysql独有的特性和实现细节对性能的影响是很明显的,因为做好Mysql数据库的设计很关键。对于数据库设计,我们不得不提表字段的类型选择,由于Mysql支持的数据类型非常多,因此如何选…

rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列

延迟队列是为了存放那些延迟执行的消息&#xff0c;待消息过期之后消费端从队列里拿出来执行。DLX TTL 方式存在的时序问题对于延迟队列不管是 AMQP 协议或者 RabbitMQ 本身是不支持的&#xff0c;之前有介绍过如何使用 RabbitMQ 死信队列(DLX) TTL 的方式来模拟实现延迟队列…

JS - 按钮倒计时

效果&#xff1a; html代码&#xff1a; <input type"button" id"btn" value"点击获取效验码" />js代码&#xff1a; //倒计时var wait60;function time(o) {if (wait 0) {o.removeAttribute("disabled"); o.value&qu…

python安装报错类型_Python处理验证码第一篇(pytesser初探及报错处理)

前言&#xff1a;春节期间&#xff0c;无法全身心投入地去写爬虫&#xff0c;那就玩玩验证码吧&#xff0c;应该比较有趣&#xff01;首次接触验证码识别&#xff0c;用pytesser接触一下最简单的验证码先&#xff0c;代码参照&#xff1a;使用python以及工具包进行简单的验证码…

debian添加删除用户

debian添加删除用户增加普通用户命令&#xff1a;#adduser abc#passwd abc#exit用abc登录/etc/passwd中保存了用户信息LINUX创建用户的命令useradd -g test -d /home/test1 -s /etc/bash -m test1注解&#xff1a;-g 所属组 -d 家目录 -s 所用的SHELL删除用户命令userdel -r te…

bin文件怎么转换成文本文档_怎么把pdf文件转换成word文档?这样转很简单

在日常的学习、工作生活中&#xff0c;小伙伴们总少不了要对文件格式进行转换操作&#xff0c;例如把pdf文件转换成word文档。对于职场老手来说&#xff0c;这当然不算一个难度操作&#xff0c;甚至还很简单。但对于职场新人而言&#xff0c;找不对方法&#xff0c;可能操作起来…

python私有属性怎么定义_Python中定义私有属性的方法是()。

【判断题】请假条带有请求的性质,所以一般来说篇幅要尽量长一些,以示郑重;更多要用煽情性语句,以打动对方。( )【单选题】关于类和对象的关系,下列描述正确的是()。【选择】Трудоспособный возраст в России у женщин считается _…