每个测试用例单独执行的时候,都不会有任何问题,但是两个放在一起执行的时候,问题就来了,两个用例创建了同名的文章,这样就直接导致测试结果的不稳定。为了解决这个问题,也许有人会创建一个随机生成文章标题的帮助类(Helper Class),这种编码的难度很大,因为需要确保文章的标题永远是唯一的(或许可以考虑Guid?)。
2. 节省测试的时间,在用例中执行过多的步骤也会增加测试时间。虽然测试团队都会在晚上批量执行自动化测试用例,但是在产品开发的过程当中,测试用例通过率不能达到100%是很正常的。对于每一个失败的测试用例,测试人员都要分析失败的原因—判断是产品的缺陷导致的,还是由于测试代码本身的问题引起的。额外的测试步骤也会相应地增加测试人员分析失败的时间(一般测试人员都会重新执行一遍测试代码来找出问题原因)。
3. 增加不必要的测试用例失败,测试可以分好几块,一种是功能测试,也就是验证产品的功能是否可以正常工作;一种是压力测试,即测试产品在极端情况下的执行情况;还有其他的例如性能测试,国际化测试等等。一般来说,不同的测试都会有自己的自动化测试用例集合。如果在功能测试当中,用例代码在系统里面添加了很多冗余数据,执行的测试用例多了,必然导致网站的性能和反应速度会有所下降。而在测试代码中,一般都会在执行一步操作以后,等待一段时间—等网页的内容刷新。网站反应速度的下降,直接导致测试失败。例如本来在编写测试代码的时候,3秒钟肯定会刷新的网页,在测试执行的环境中,因为过多的冗余数据,30秒可能都打不开一个网页。当然啦,网站反应速度的下降肯定是产品代码的缺陷,但是不应该将压力测试和功能测试混合起来做。
因此,我个人建议,在测试过程中,例如前面举的评论功能的测试中,完全可以事先在网站的数据库中先创建好一篇或多篇专门用来做评论测试的文章。而每天晚上,在大规模执行自动化测试用例之前,编写一个小的脚本,将网站的数据库替换成这个基准数据库。
又比如,为了测试用户权限管理的功能,完全可以事先在网站的数据库当中先准备好一个管理员帐号,这个管理员帐号和密码可以当作一个常量,然后测试代码里都使用这个帐号来执行权限管理的测试。例如下面的代码:
public class Consts { public const string TimeToWaitForPageToLoad = "30000";
public const string AdminUserName = "administrator";
public const string AdminPassword = "0123456"; }
public class UserHelper : UIHelperBase { public UserHelper(TestLibrary settings) : base(settings) { }
public void LogOnAsAdmin() { LogOn(TestLibrary.Consts.AdminUserName, TestLibrary.Consts.AdminPassword); }
public void LogOn(string username, string password) { if (String.IsNullOrEmpty(username)) throw new CaseErrorException(new ArgumentNullException("username")); if (String.IsNullOrEmpty(password)) throw new CaseErrorException(new ArgumentNullException("password"));
selenium.Open("/"); Thread.Sleep(2000); if (selenium.IsElementPresent("link=Log On")) { selenium.Click("link=Log On"); } if (selenium.IsElementPresent("link=Login")) { selenium.Click("link=Login"); } selenium.WaitForPageToLoad(TestLibrary.Consts.TimeToWaitForPageToLoad); selenium.Type("username", username); selenium.Type("password", password); selenium.Click("//input[@value='Log On']"); selenium.WaitForPageToLoad(TestLibrary.Consts.TimeToWaitForPageToLoad); } } |