我正在寻找一种方法,能够使用不同的输入文件运行相同的编码ui测试类,例如我在应用程序中对端到端流程进行了测试,我希望能够在应用程序内部对两个不同的用户执行不同的工作流程来运行此测试。我不想每次都运行这两个测试(这可能是在数据输入csv中有两行)。到目前为止,我无法找到这样做的方法。任何帮助/指导都表示赞赏。
答案 0 :(得分:1)
我可以想到三种可能性。
1
您可以将CSV排列为两组,例如
UserName1,Password1,DataAa1,DataBb1,UserName2,Password2,DataAa2,DataBb2
在测试方法中,更改数据源访问以使用类似
的内容string testCode = (...) ? "1" : "2";
... = TestContext.DataRow["UserName" + testCode].ToString();
... = TestContext.DataRow["Password" + testCode].ToString();
这需要其他东西来指定要使用的数据文件。这可以通过环境变量来完成。
2
解决方案中有三个CSV文件。其中两个是两次运行的CSV文件。例如SourceData1.csv
和SourceData2.csv
。第三个文件是SourceData.csv
,在[DataSource(...)
属性中以"|DataDirectory|\\SourceData.csv"
命名。在" .testsettings" file提供批处理文件的名称,该文件选择所需的SourceData1.csv
或SourceData2.csv
文件,并使用xcopy
复制该文件并覆盖SourceData.csv
。
3
假设测试当前写为
[TestMethod, DataSource(...)]
public void MyCodedUiTestMethod() {
...body of the test
}
然后改为使用两种调用第三种方法的测试方法。这两种方法指定不同的CSV文件,被调用的方法从正在读取的文件中访问值。
[TestMethod, DataSource(... SourceData1.csv ...)]
public void MyFirstCodedUiTestMethod() {
BodyOfTheTest();
}
[TestMethod, DataSource(... SourceData2.csv ...)]
public void MySecondCodedUiTestMethod() {
BodyOfTheTest();
}
public void BodyOfTheTest() {
...body of the test
... = TestContext.DataRow["UserName"].ToString();
... = TestContext.DataRow["Password"].ToString();
}
请注意,TextContext
在类的所有方法中都是可见的,因此TestContext.DataRow...
表达式可以在指定[DataSource...]
属性的方法之外编写。
答案 1 :(得分:0)
如果它是一个相同的测试用例,那么你应该有相同的输入参数集,用你的测试参数创建一个类,然后用不同的参数集将类实例列表序列化为XML文件。运行测试用例时,您可以反序列化XML文件(在TestInitialize()块内)并迭代每个类实例并传递实例编码的UI测试方法。您可以根据xml文件中的类实例计数,随意调用测试方法。这是我用于编码UI测试的数据驱动测试的方法。
使用测试参数
创建一个类 public class ClientDetails
{
public String ClientType { get; set; }
public String clientCode { get; set; }
public String Username { get; set; }
public String Password { get; set; }
}
创建一些类实例并首先序列化为XML文件
// location to store the XML file following relative path will store outside solution folder with
// TestResults folder
string xmlFileRelativePath = "../../../TestClientInfo.xml";
public List<ClientDetails> ListClientConfig = new List<ClientDetails>();
ClientDetails Client1 = new Classes.ClientDetails();
Client1.ClientType = "Standard";
Client1.clientCode = "xxx";
Client1.Username = "username";
Client1.Password = "password";
ClientDetails Client2 = new Classes.ClientDetails();
Client2.ClientType = "Easy";
Client2.clientCode = "xxxx";
Client2.Username = "username";
Client2.Password = "password";
ListClientConfig.Add(Client1);
ListClientConfig.Add(Client2);
XmlSerialization.genericSerializeToXML(ListClientConfig, xmlFileRelativePath );
在测试方法中或任何您喜欢的位置检索存储的XML对象(如果在TestInitialize()块内部,则更好)
[TestMethod]
public void CommonClientExecution()
{
List<ClientDetails> ListClientConfig = XmlSerialization.genericDeserializeFromXML(new ClientDetails(), xmlFileRelativePath );
foreach (var ClientDetails in ListClientConfig )
{
// you test logic here...
}
}
用于序列化对象集合的XML序列化方法
using System.Xml;
using System.Xml.Serialization;
class XmlSerialization
{
public static void genericSerializeToXML<T>(T TValue, string XmalfileStorageRelativePath)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
FileStream textWriter = new FileStream((string)System.IO.Path.GetFullPath(XmalfileStorageRelativePath), FileMode.OpenOrCreate, FileAccess.ReadWrite);
serializer.Serialize(textWriter, TValue);
textWriter.Close();
}
public static T genericDeserializeFromXML<T>(T value, string XmalfileStorageFullPath)
{
T Tvalue = default(T);
try
{
XmlSerializer deserializer = new XmlSerializer(typeof(T));
TextReader textReader = new StreamReader(XmalfileStorageFullPath);
Tvalue = (T)deserializer.Deserialize(textReader);
textReader.Close();
}
catch (Exception ex)
{
// MessageBox.Show(@"File Not Found", "Not Found", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
return Tvalue;
}
}