C# 编码UI测试用例代码生成

C# 编码UI测试用例代码生成,c#,wpf,coded-ui-tests,mahapps.metro,C#,Wpf,Coded Ui Tests,Mahapps.metro,我有一个桌面应用程序,其中有200个具有不同输入参数的测试用例 现在的问题是每次我用不同的输入参数记录每个测试用例 是否有任何方法可以让我复制代码并更改参数,以便我的代码在所有测试用例中保持不变,仅输入参数更改?您可以通过带有批处理脚本的命令行将事件参数用于应用程序,或者您可以创建传递所需参数的函数。 在主标题中,您可以使用 main(字符串eventargs[]) 字符串变量将是来自命令行的事件参数,这里有几点需要解决。首先,您可以使用中描述的数据驱动方法运行测试 更重要的是,在我看来,你是如

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

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


是否有任何方法可以让我复制代码并更改参数,以便我的代码在所有测试用例中保持不变,仅输入参数更改?您可以通过带有批处理脚本的命令行将事件参数用于应用程序,或者您可以创建传递所需参数的函数。 在主标题中,您可以使用 main(字符串eventargs[])


字符串变量将是来自命令行的事件参数,这里有几点需要解决。首先,您可以使用中描述的数据驱动方法运行测试

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

编写测试时,重要的是要有可重用的代码进行测试。我会推荐看一些类似或的东西(我写了页面建模的东西)。通过这些方法,您的测试代码更易于维护和灵活(更易于手动更改)。这将允许进行极其简单的数据驱动测试

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);
    }
}
公共类计算参数
{
公共双左数{get;set;}
公共字符串运算符{get;set;}
公共双RightNumber{get;set;}
公共双结果{get;set;}
公共重写字符串ToString(){return$“{LeftNumber}{Operator}{RightNumber}={Result}”;}
}
执行计算时公共无效\u结果正确(){
ICollection参数=getParameters();
列表异常=新列表();
foreach(参数中的计算参数)
{
尝试
{
var测试结果=
modelUnderTest.LeftSideNumber.SetValue(parameter.LeftNumber)//设置第一个数字
.Operator.SetValue(parameter.Operator)//设置符号
.RightSideNumber.SetValue(参数.RightNumber)//设置正确的编号
.Evaluate.Click()//按Evaluate按钮
.Result;//获取结果
AreEqual(testResult,parameter.Result);
}
捕获(例外e)
{
添加(新异常($”参数失败:{parameter}”,e));
}
}
if(exceptions.Any()){
抛出新的AggregateException(异常);
}
}
其次,为什么您需要在给定的测试中测试这么多输入/输出组合?如果您正在测试“给定登录页面,当提供无效凭据时,会向用户提供警告。”您真正需要测试多少无效输入?将对有效凭证进行第二次测试,无需数据驱动

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

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


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

我想知道是谁在对编码的ui问题进行投票,而没有留下任何关于为什么。。。