我是一名从事自动化工作的测试人员,最近正在研究webdriver,我通过pageObjects获得了这个想法,以及如何使用Nunit运行测试。 我的问题是我不想以预定义的顺序运行测试。我们目前使用的GUI自动化解决方案使用ModelBasedTesting工具GraphWalker在执行时生成测试序列,我想继续这种方法。
它的工作原理如下:图表包含动作和验证步骤以及一些确定如何“走图”的逻辑。每个步骤代表一个在webdriver中执行的方法。
我当然可以创建很多方法并逐个调用它们,但是我不会得到像Nunit这样的测试框架或者PageObjects结构的支持。
我想(我想)是:
[TestFixture]
public abstract class LoginTest : TestFixtureBase
{
[Test]
public void e_test1()
{
loginPage = PageBase.GetInstance<Login>(driver, "Title");
accountHome = loginPage.MainLogin(username, password);
Assert.IsTrue(accountHome.UserLoggedIn(),"fail");
}
[Test]
public void v_test1()
{
loginPage = accountHome.LogOut();
Assert.IsTrue(loginPage.UserLoggedOut(), "Fail");
}
.
.
.
[Test]
public void e_testN()
{
//Do something
}
然后当我运行图表时,它给我“e_test2”作为第一步,魔术代码运行e_test2()。下一步是“v_test1”,以便执行测试。 谁知道怎么做?
更新: 我已经尝试了TestCaseSource属性并使其工作,但只有在测试之前运行图形并返回完整序列时。我正在寻找一种在“在线”时执行一步的方法。 这有效:
[Test, TestCaseSource("RunModel")]
public void LoginAndOut(string method)
{
object obj = this.GetType().InvokeMember(method, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, this, null);
}
public string[] RunModel()
{
List<string> methods = new List<string>();
while (Model.graphWalker.HasNextStep())
{
methods.Add(Model.graphWalker.GetNextStep().ToString());
}
return methods.ToArray();
}
但我想完成类似的事情:
while (Model.graphWalker.HasNextStep())
{ //Get next method from GraphWalker Soap-service.
nextMethodToRun = Model.graphWalker.GetNextStep().ToString());
//handle Method result, if ok continue.
}
答案 0 :(得分:1)
放弃NUnit,找到了Gallio / MbUtnit和DynamicTestFactory的解决方案。 按预期工作。
[DynamicTestFactory]
public IEnumerable<Test> LoginAndOut()
{
string method;
while (Model.graphWalker.HasNextStep())
{
method=Model.graphWalker.GetNextStep().ToString();
if (method == string.Empty)
break;
yield return new TestCase(method, () =>
{
object obj = this.GetType().InvokeMember(method, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, this, null);
});
}
}
答案 1 :(得分:0)
你需要在GraphWalker和你的代码之间创建一个适配器 - 解析GraphWalker创建的路径并相应地启动所需的测试方法,即创建一个测试类的实例(然后它不能是抽象的)并调用所需的方法。