使用xUnit.net进行数据驱动的单元测试

发表于:2017-7-19 14:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:衡泽_徐峰    来源:51Testing软件测试网采编

目前在.Net框架下的测试工具主要有Nunit、内置的MSTest以及xUnit这三个工具,本文就简单的介绍一下如何在VS中使用xUnit进行数据驱动的单元测试
  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方法加载解析好的数据。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号