我正在为我们的应用程序编写一套黑盒自动化测试。我一直遇到同样的设计问题,所以我想知道这里的人是怎么想的。
基本上,它是一个简单的 CRUD 系统。为方便起见,让我们看看您正在测试创建、查看、编辑和删除用户帐户的屏幕。我想做的是编写一个测试用户创建是否正常工作的测试,另一个检查查看用户是否显示与您最初输入的数据相同的测试,另一个检查编辑用户是否正常工作的测试,最后是测试删除用户是否正常。
问题是,如果我这样做,那么测试必须按特定顺序运行,否则它们将无法工作。(例如,您不能删除尚未创建的用户。)现在有人说测试设置应该创建测试需要的所有内容,并且拆卸应该使系统恢复到一致状态。但是想一想……创建用户测试之后需要删除该用户,而删除用户测试必须先创建一个用户……所以这两个测试现在有相同的代码,唯一的区别是该代码是否在设置/正文/拆卸中。这似乎是错误的。
简而言之,我似乎面临着几种选择,所有这些似乎都被打破了:
- 使用 setup 创建用户并使用 teardown 删除他们。这会将所有创建用户和删除用户测试代码复制为设置/拆卸代码。
- 强制测试以特定顺序运行。这违反了测试应该独立工作并且可以以任何顺序运行的原则。
- 编写一个巨大的测试,创建一个用户,查看用户,编辑用户,然后删除用户,所有这些都是一个巨大的整体块。
请注意,创建用户并非易事;涉及很多步骤。同样,在删除用户时,您必须指定如何处理分配给他们的项目等。无论如何这都不是一个简单的操作。
现在,如果这是一个白盒测试,我可以模拟用户帐户对象,或者模拟保存它们的数据库,或者甚至在磁盘上生成真实的数据库。但这些都是黑盒测试,只测试外部的、用户可见的界面。(即,单击屏幕上的按钮。)这个想法是从头到尾测试整个系统,而不需要修改它[显然通过 GUI 命令除外]。