在进行自动化测试过程中,很多的框架的测试数据都是从外部(Excel,Csv,数据库)读取的,一般数据都是固化数据。显然这样做不够灵活,而且很多场景下这些数据需要频繁的改动,比如用户注册,第一次这个数据注册成功了,但是第2次再运行,很显然会失败,因为这个用户已经注册过了。这时候我们会想到生成随机数据,但是随机什么样的数据呢?这需要定义生成数据的规则,对于数据的匹配规则,我们很快想到了正则表达式,那么测试数据写成正则表达式,然后根据正则表达式来生成数据不是Perfect,确实是这样。但是对于正则表达式的反解析绝对是一个不轻松的工作,而且需要相当的正则表达式的知识。那么我们何不自己定义数据生成的规则呢?这就是我下面想讲的,如何定义自己的规则,然后生成对应的测试数据?
首先,我们要先定义规则标识,只有这样,数据被读取到代码后,它才会去解析数据。这样我们给出这样的标识 Rule[],当测试代码读取到测试数据为Rule[]时,就知道这是一个需要解析的测试数据,调用解析方法进行GetReturnData(string name)方法进行解析。Rule[]的[]括号中就是我们的数据规则,比如数据中固定的数据我们定义为F(…) ,随机数定义为R(…),随机字符串定义为S(…)等等。比如我们有这样一个数据规则Rule[F(fix)|R(5)|S(2)],这样在测试输入时就应该是输入一个fix+5位随机数+2个随机字符的数据。
而因为定义数据规则后,输入的数据时不可预测的,那之后的测试过程中如果用到这个测试数据该怎么办呢?我们应该可以有个方法可以获取到输入的数据。那么在输入时我们就定义一个规则:Value1 =Rule[],就是说在输入数据的同时把这个值赋值给Value1。而这个Value1会被添加到一个泛型字典中,这样在以后需要用到该数据的地方我们就可以定义一个规则Rule[E(Value1)]来读取value1的值。
就这样,我们可以灵活的定义自己的数据规则,使测试数据更为灵活,简单,方便。
具体实现代码如下:
public class UtilityClass
{
private static Dictionary<string, string> returnData = new Dictionary<string, string>();
static UtilityClass()
{
}
public static string GetReturnData(string name)
{
foreach (string item in returnData.Keys)
{
if (name == item)
{
return returnData[item];
}
}
return "";
}
public static string GetTestDate(string commandArgs)
{
Regex regex = new Regex(@"(.*)Rule\[(.*)\]");
Regex returnRegex = new Regex(@"(.*)=");
Regex fixeRegex = new Regex(@"(F\()(.*)(\))");
Regex randomRegex = new Regex(@"(R\()(\d*)(\))");
Regex expectedRegex = new Regex(@"(E\()(.*)(\))");
if (regex.IsMatch(commandArgs))
{
var items = regex.Match(commandArgs).Groups;
string[] regItems = (items[2].ToString()).Split('|');
StringBuilder sb = new StringBuilder();
for(int i=0;i<regItems.Length;i++)
{
//固定值
if (fixeRegex.IsMatch(regItems[i].ToString()))
{
var result = fixeRegex.Match(regItems[i].ToString()).Groups;
sb.Append(result[2].Value);
}
//随机数
if (randomRegex.IsMatch(regItems[i].ToString()))
{
var result = randomRegex.Match(regItems[i].ToString()).Groups;
int number = Convert.ToInt32(result[2].Value);
sb.Append(GetRandomNumber(number));
}
//之前输入过的测试数据
if (expectedRegex.IsMatch(regItems[i].ToString()))
{
var result = expectedRegex.Match(regItems[i].ToString()).Groups;
sb.Append(GetReturnData(result[2].Value));
}
}
if(returnRegex.IsMatch(items[1].ToString()))
{
string name = returnRegex.Match(items[1].ToString()).Groups[1].Value;
if(returnData.ContainsKey(name))
{
returnData.Remove(name);
}
returnData.Add(name, sb.ToString());
}
return sb.ToString();
}
else
{
return commandArgs;
}
}
/// <summary>
/// 生成随机数
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
public static string GetRandomNumber(int length)
{
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
sb.Append(random.Next(10).ToString());
}
return sb.ToString();
}
}