我正在为我们的应用程序编写一套黑盒自动化测试。我一直碰到相同的设计问题,所以我想知道这里的人们对此有何想法。
基本上,这是一个简单的CRUD系统。为了论证,让我们看看您正在测试屏幕以创建,查看,编辑和删除用户帐户。我想做的是编写一个测试,测试该用户创建是否正常,另一个测试,检查用户的查看是否显示与您最初键入的数据相同,另一个测试,检查用户编辑的正常,最后一个测试删除用户是否可以。
问题是,如果我这样做,那么测试必须按一定顺序运行,否则它们将无法工作。 (例如,您不能删除尚未创建的用户。)现在有人说测试设置应创建测试所需的所有内容,而拆卸应使系统恢复一致状态。但是考虑一下...创建用户测试之后将需要删除该用户,而删除用户测试将必须首先创建一个用户...因此,这两个测试现在具有相同的代码,唯一的区别是该代码是否在设置/正文/拆卸中。那似乎是错误的。
简而言之,我似乎面临几种选择,所有这些似乎都坏了:
使用安装程序创建用户,然后使用拆卸将其删除。这会将所有“创建用户”和“删除用户”测试代码复制为设置/拆卸代码。
强制测试以特定顺序运行。这违反了测试应该独立运行并且可以按任何顺序运行的原则。
编写一个巨大的测试来创建用户,查看用户,编辑用户,然后删除用户,这些都是一个巨大的整体块。
请注意,创建用户不是一件容易的事。涉及很多步骤。同样,删除用户时,您必须指定如何处理分配给他们的项目,等等。无论如何,这都不是简单的操作。
现在,如果这是一个白盒测试,我可以模拟用户帐户对象,或模拟保存它们的数据库,甚至在磁盘上生产真实的数据库。但是这些是黑盒测试,仅测试外部的,用户可见的界面。 (即,单击屏幕上的按钮。)这个想法是从头到尾测试整个系统,而不用修改它(显然,通过GUI命令除外)。
最佳答案
我们有同样的问题。我们走了两条路。在一种测试样式中,我们根据您的建议使用设置和拆卸来创建测试所需的数据(用户,票证等)。在另一种样式中,我们使用数据库中预先存在的测试数据。因此,例如,如果测试为AdminShouldBeAbleToCreateUser
,则我们不会执行任何一项测试,因为这就是测试本身。但是,如果测试为ExistingUserShouldBeAbleToCreateTicket
,则在测试数据中使用预定义的用户;如果测试为UserShouldBeAbleToDeleteOwnTicket
,则使用预定义的用户并在设置中创建票证。