我有一个小问题,我已经创建了一些Selenium测试。问题是我无法订购我创建的测试用例。我知道不应该订购单元测试,但这是我在我的情况下所需要的。我必须遵循以下步骤:首先登录,创建新客户,更改有关客户的一些详细信息,然后最终注销。
由于没有在NUnit中订购单元测试的选项,我无法执行此操作。
我已经尝试了另一个选项,在Visual Studio中创建一个unittest项目,因为Visual Studio 2012能够创建一个有序的单元测试。但这不起作用,因为我在运行ASP.NET项目时无法运行单元测试。另一个解决方案文件也不是一个好的选择,因为我想在Selenium测试提交后验证我的数据。
你们中有人有另一种解决方案来解决我的问题吗?
答案 0 :(得分:1)
如果您想按特定顺序测试所有这些步骤(并通过它的声音,作为单个会话),那么它实际上更像是您正在谈论的验收测试;在这种情况下,编写更复杂的测试方法并在每个步骤后断言您的条件是不是罪。
如果要在真正的隔离中测试每个步骤(纯单元测试),那么每个单元测试必须能够自行运行而不需要任何其他测试;但是当你测试实际的网站用户界面本身时,这对你来说真的不是一个选择。
当然,如果你真的想让每一个测试以某种方式设置每一个依赖,而不参考任何其他动作(例如在上一次测试中你需要伪造登录令牌,你的数据层将不得不假装你增加了一个新的客户等。很多工作可疑的好处...)
我之所以这样说,是因为您已经为服务器端控制器,图层,模型等编写了单元测试,而您没有参考浏览器中运行的实际站点而运行它们,因此确信您网站的各个后端部分可以执行他们应该执行的操作
在您的情况下,我建议更多的混合集成/验收测试
void Login(IWebDriver driver)
{
//use driver to open browser, navigate to login page, type user/password into box and press enter
}
void CreateNewCustomer(IWebDriver driver)
{
Login(driver);
//and then use driver to click "Create Customer" link, etc, etc
}
void EditNewlyCreatedCustomer(IWebDriver driver)
{
Login(driver);
CreateNewCustomer(driver);
//do your selenium stuff..
}
and then your test methods:
[Test]
void Login_DoesWhatIExpect()
{
var driver = new InternetExplorerDriver("your Login URL here");
Login(driver);
Assert(Something);
}
[Test]
void CreateNewCustomer_WorksProperly()
{
var driver = new InternetExplorerDriver("your Login URL here");
CreateNewCustomer(driver);
Assert(Something);
}
[Test]
void EditNewlyCreatedCustomer_DoesntExplodeTheServer()
{
var driver = new InternetExplorerDriver("your Login URL here");
EditNewlyCreatedCustomer(driver);
Assert(Something);
}
通过这种方式,具体测试的顺序无关紧要;当然,如果Login
测试失败,那么CreateNewCustomer
和EditNewlyCreatedCustomer
测试也将失败,但在这种情况下,这实际上是无关紧要的,因为您正在测试整个操作的“线程”