动态选择要使用 Web 驱动程序运行的测试

本文关键字:驱动程序 运行 测试 Web 选择 动态 | 更新日期: 2023-09-27 18:30:55

我是一名从事自动化工作的测试人员,最近正在研究Webdriver,例如,我得到了pageObjects的想法以及如何使用Nunit运行测试。我的问题是我不想按预定义的顺序运行测试。我们目前拥有的GUI自动化解决方案使用基于模型的测试工具GraphWalker在执行时生成测试序列,我想继续使用这种方法。

简而言之,它的工作原理是这样的:图形包含操作和验证步骤以及一些逻辑来确定如何"遍历图形"。每个步骤表示要在 Web 驱动程序中执行的方法。

我当然可以制作很多方法并逐个调用它们,但是这样我就不会得到像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.
        }

动态选择要使用 Web 驱动程序运行的测试

放弃了

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);
                });
        }
     }
你需要在 GraphWalker

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