我正在为一个应用程序编写一个C#Web测试项目,该项目将从XML配置文件中读取值并执行自动化测试。我现在的代码正在运行,但每次需求更新时都必须更改。
private void takeAction(string keyData, string locator, string action)
{
switch (keyData)
{
case "Origin":
if (action == "Input")
{
origin_input(locator, "MEL");
}
break;
case "Destination":
if (action == "Input")
{
destination_input(locator, "Manila");
}
break;
case "DepartDate":
if (action == "Input")
{
textinput(locator, "21/10/2014");
}
break;
case "ReturnDate":
if (action == "Input")
{
textinput(locator, "06/11/2014");
}
break;
case "Adult":
if (action == "Select")
{
objSelect(locator, "3");
}
break;
case "SearchButton":
if (action == "Button")
{
objClick(locator);
}
break;
...
}
}
此代码与对象的名称匹配,检查所需的操作,然后使用一些参数调用相应的函数。
我已经阅读了一些开放/封闭原则的例子,但是,我无法解决这个问题,因为同时检查了多个条件。
更多" keydata"将被添加到代码中,我相信switch语句似乎不是正确的选项。任何有关改进此代码的建议都将受到赞赏。
答案 0 :(得分:3)
如果我是你,我会使用某种抽象。例如,您在switch中的单个if语句内调用的所有方法都使用字符串locator
和可选的其他字符串参数(或者在最后一种情况下没有)。此外,我认为您可以通过组合keyData
和acton
参数的值来简化逻辑,因为在组合时它们会产生唯一键。
您可以使用以下方法:
public interface ITestableAction{
void Execute(string locator);
}
public class OriginInputAction : ITestableAction{
public void Execute(string locator){
origin_input(locator, "MEL"); //I'd make the origin_input method static...
}
}
public class DestinationInputAction : ITestableAction{
public void Execute(string locator){
destination_input(locator, "Manila");
}
}
最后,您的班级需要有一个字典,其中keyData
和acton
代表键。
private Dictionary<string, ITestableAction> actions =
new Dictionary<string, ITestableAction>();
actions.Add("OriginInput", new OriginInputAction());
actions.Add("DestinationInput", new DestinationInputAction());
等...
因此,在您的方法中,您不必经常检查所有keyData
和action
值的配对方式,而只需查找相应的ITestableAction即可:
private void takeAction(string keyData, string locator, string action)
{
string key = string.Format("{0}{1}", keyData, action);
if(actions.ContainsKey(key))
{
ITestableAction action = actions[key]
action.Execute(locator);
}
}
这是“我应该知道它”的设计模式之一。无法真正指出它究竟是什么,但它很有用。它应该可以帮助你,因为你没有每次都改变逻辑。只需创建一个继承自ITestableAction的新类,并将其添加到字典中。在一天结束时,逻辑树变得更短。但话又说回来,请不要以表面价值看待......有数百种方法可以编写代码,只有你知道自己的要求和赌注。这只是一个建议,希望能指出你正确的方向。
谢谢,
马丁。
答案 1 :(得分:1)
您可以声明性地定义您的案例,如下所示。您也可以使用类,但这会变得更复杂,因为类需要访问您传递locator
的方法。如果这种方法仍然需要更多的分离,那么将每个案例分成一个类可能是值得的。
public delegate void TestAction(string locator);
public class ActionCase
{
public string ExpectedAction { get; set; }
public TestAction Test { get; set; }
}
private Dictionary<string, ActionCase> cases = new Dictionary<string, ActionCase>
{
{
"Origin",
new ActionCase
{
ExpectedAction = "Input",
Test = locator => origin_input(locator, "MEL")
}
},
//Define the rest here
};
private void takeAction(string keyData, string locator, string action)
{
var case = cases[keyData];
if (action == case.ExpectedAction)
case.Test(locator);
}
答案 2 :(得分:0)
嗯,你可以简单地做一些事情:
switch (keyData + action)
{
case "OriginInput":
origin_input(locator, "MEL");
break;
}
答案 3 :(得分:-1)
我认为你只需要一个额外的变量
private void takeAction(string keyData, string locator, string action, string searchfor)
{
switch (keyData)
{
case "Origin":
if (action == "Input")
{
origin_input(locator, searchfor);
}
break;