2012-04-13 69 views
1

我是一个测试工作与自动化,最近看到webdriver,我得到了pageObjects的想法,以及如何运行与Nunit的测试为例。 我的问题是我不想按预定义顺序运行测试。我们目前使用的GUI自动化解决方案使用ModelBasedTesting工具GraphWalker在执行时生成测试序列,我想继续这种方法。动态选择测试与webdriver运行

它的工作原理如下:图形包含动作和验证步骤以及一些逻辑来确定如何“走图”。每一步代表一个要在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. 
     } 

回答

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); 
       }); 
     } 
    } 
0

你需要创建GraphWalker和你的代码之间的适配器 - 解析由GraphWalker创建的路径和启动相应地需要测试方法,即创建一个测试类的实例(它不能是抽象的)然后调用所需的方法。

+0

我还想让NUnit运行测试以免费获得testresult数据。如果我让我的控制台应用程序运行测试(通过GraphWalker),我将不得不使用我自己的报告工具,并且不能使用NUnit的其他漂亮功能。 – Johan 2012-04-17 07:07:49