编码的UI测试用例代码生成

时间:2016-05-29 03:47:24

标签: c# wpf coded-ui-tests mahapps.metro

我有一个桌面应用程序,其中我有200个具有不同输入参数的测试用例

现在的问题是每次我使用不同的输入参数记录每个测试用例

是否有任何方法可以复制代码并更改参数,以便我的代码对于所有测试用例保持相同,只输入参数更改

2 个答案:

答案 0 :(得分:1)

这里有几点需要解决。首先,您可以使用the link above中描述的数据驱动方法运行测试。

更重要的是,在我看来,无论如何,你是如何编写测试的,以便它们可以被数据驱动,你究竟在测试什么需要这么多组合?

编写测试时,重要的是要使用可重用的代码进行测试。我建议看看像Code First ScaffoldingCoded UI Page Modeling这样的东西(我写过页面建模的东西)。使用这些方法,您的测试代码更易于维护和灵活(更容易手动更改)。这将允许极其简单的数据驱动测试。

public void WhenPerformingCalculation_ThenResultIsCorrect() {
    // imagine calculator with two numbers and a sign
    var testResult =
    modelUnderTest.LeftSideNumber.SetValue(3) // set first number
                  .Operator.SetValue("*") // set sign
                  .RightSideNumber.SetValue(10) // set right number
                  .Evaluate.Click() // press evaluate button
                  .Result; // get the result
    Assert.AreEqual(testResult, 30);
}

变为

public class CalculationParameters
{
    public double LeftNumber {get;set;}
    public string Operator {get;set;}
    public double RightNumber {get;set;}
    public double Result {get;set;}
    public override string ToString(){ return $"{LeftNumber} {Operator} {RightNumber} = {Result}"; }
}

public void WhenPerformingCalculation_ThenResultIsCorrect() {
    ICollection<CalculationParameters> parameters = getParameters();

    List<Exception> exceptions = new List<Exception>();
    foreach(CalculationParameters parameter in parameters)
    {
        try
        {
            var testResult =
            modelUnderTest.LeftSideNumber.SetValue(parameter.LeftNumber) // set first number
                          .Operator.SetValue(parameter.Operator) // set sign
                          .RightSideNumber.SetValue(parameter.RightNumber) // set right number
                          .Evaluate.Click() // press evaluate button
                          .Result; // get the result
            Assert.AreEqual(testResult, parameter.Result);
        }
        catch (Exception e)
        {
           exceptions.Add(new Exception($"Failed for parameters: {parameter}", e));
        }
    }
    if(exceptions.Any()){
        throw new AggregateException(exceptions);
    }
}

其次,为什么需要在给定的测试中测试这么多的输入/输出组合?如果您正在测试“给定登录页面,提供无效凭据时,则会向用户提供警告”。您确实需要测试多少个无效输入?将进行第二次有效凭证测试,无需数据驱动。

我要提醒您注意,您没有在UI中测试应该是单元测试的内容。听起来您正在测试不同的输入组合,以查看UI是否生成正确的输出,这可能是您的底层系统的单元测试。在测试UI时,通常只需测试对视图模型的绑定是否正确,而不是测试计算或其他服务器逻辑是否准确执行。

我提供的示例显示了我不会测试客户端的内容,除非该计算器仅存在于客户端(没有服务器端验证或有关计算的逻辑)。即使在这种情况下,我可能会得到一个javascript测试运行器来测试为我的计算器供电的视图模型,而不是使用编码的ui来进行此测试。

您能否提供一些您正在测试的输入/输出组合的示例?

答案 1 :(得分:0)

您可以通过命令行使用批处理脚本将事件参数用于应用程序,也可以创建将传递请求参数的函数。 在主标题中,您可以使用     main(string eventargs []);

其中string变量将是命令行的事件参数