1. 安装
直接使用NuGet安装如下两个库即可:
PM> Install-Package xunit PM> Install-Package xunit.runner.visualstudio -Pre (Visual Studio测试浏览器支持, VS2015目前必须装Pre的) |
2.搭建项目
新建一个类库项目包含两个目录,分别存放:
TestDatas文件夹:测试需要的数据及其类型 UnitTests文件夹:单元测试 |
目录结构
测试数据采用csv格式,好处是可以使用Excel进行编辑,同时数据结构易于解析。
ProviderTypeData_AddProviderType.csv文件在Excel中和VS中编辑的结果如下:
Excel中的测试数据
在VS中打开后的格式
3.解析数据
需要有一个CSVFileHelper基础类来将csv格式的数据转换成DataTable。
public static class CSVFileHelper { public static DataTable OpenCSV(string filePath) { //Encoding encoding = Common.GetType(filePath); //Encoding.ASCII;// DataTable dt = new DataTable(); FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); StreamReader sr = new StreamReader(fs, System.Text.Encoding.GetEncoding("GB2312")); //StreamReader sr = new StreamReader(fs, encoding); //string fileContent = sr.ReadToEnd(); //encoding = sr.CurrentEncoding; //记录每次读取的一行记录 string strLine = ""; //记录每行记录中的各字段内容 string[] aryLine = null; string[] tableHead = null; //标示列数 int columnCount = 0; //标示是否是读取的第一行 bool IsFirst = true; //逐行读取CSV中的数据 while ((strLine = sr.ReadLine()) != null) { //strLine = Common.ConvertStringUTF8(strLine, encoding); //strLine = Common.ConvertStringUTF8(strLine); if (IsFirst == true) { tableHead = strLine.Split(','); IsFirst = false; columnCount = tableHead.Length; //创建列 for (int i = 0; i < columnCount; i++) { DataColumn dc = new DataColumn(tableHead[i]); dt.Columns.Add(dc); } } else { aryLine = strLine.Split(','); DataRow dr = dt.NewRow(); for (int j = 0; j < columnCount; j++) { dr[j] = aryLine[j]; } dt.Rows.Add(dr); } } if (aryLine != null && aryLine.Length > 0) { dt.DefaultView.Sort = tableHead[0] + " " + "asc"; } sr.Close(); fs.Close(); return dt; } } |
4.定义数据类型
有了测试数据和数据转换工具还不够,还需要一个能被xUnit使用的类型,就是目录结构中的ProviderTypeData类。
public class ProviderTypeData : TheoryData<string, string, string> { public ProviderTypeData(string csvPath) { var path = Common.CurrentPath + csvPath; var dt = CSVFileHelper.OpenCSV(path); foreach (DataRow dr in dt.Rows) { Add(dr[0].ToString(), dr[1].ToString(), dr[2].ToString()); } } } |
父类TheoryData的泛型参数与数据源的列一一对应,测试数据有三列,所以就有三个泛型参数。
然后使用父类的Add方法加载解析好的数据。