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