使用MSTest进行单元测试

发表于:2018-4-13 15:22

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

 作者:TianFang    来源:博客园

  我之前写过一篇XUNit的简介:使用Xunit来进行单元测试。Xunit在当时确实是一个最简单易用的测试框架,然而,随着发展,Xunit也变得复杂了不少,光写一个最简单的测试就要导入8个包。
  如果在大一点的项目中使用到还罢了,但如果只是随手想写一点单元测试引入这一堆包确实看着不大舒服。于是我又看了下MS自家的MS TEST。发现随着发展,MS自家的MS TEST也改变了不少,虽然以前用过老版MS TEST的朋友基本上能拿着就用,但本文这里仍然简单的介绍一下,方便新手上路。
  新的MS TEST现在是通过Nuget的包发布了,目前MS发布了两个版本:
  ●MS TEST V1: V1的版本依赖于一个包: MSTest.TestFramework
  ●MS TEST V2:V2的版本依赖于两个包: MSTest.TestFramework和MSTest.TestAdapter
  这两个版本使用起来还是大同小异的,MS TEST V2主要是为了.net core准备的,当然也可以在.net framework上运行,并且新加入了一些扩展。
  首先来写一个简单的用例:
  [TestClass]
  public class TestClass
  {
      [TestMethod]
      public void TestPass()
      {
          Assert.IsTrue(true);
      }
  
      [TestMethod]
      public void TestFail()
      {
          Assert.IsTrue(false);
      }
  }
   
  写完后编译即可在测试管理器上看到用例:
  运行它就可以看到结果了:
   
  测试用例声明:
  测试用例的类必须是public的,并且用TestClassAttribute标记
  测试用例必须是public的,并且用TestMethodAttribute标记
  Xunit并不需要TestClass声明,但给测试类声明也是有好处的,可以对其下的所有测试用例分组。
  断言:
  可以用Assert断言类来检验测试是否成功,也可以自己写帮助类抛异常检验。
  构建和析构:
  和Xunit非常类似,测试框架执行每个测试用例的时候,会创建测试类对象,测试用例执行完后,如果测试类是IDisposable的,会执行Dispose函数。因此,简单的做法是:
  ●在测试用例类的构造函数指向数据构建操作
  ●在Dispose函数中指向数据清理操作
  另外,也可以通过TestInitialize和TestCleanup两个Attribute来指定额外的构建和清理函数。这样,一个测试用例执行的顺序是
  ●构造函数
  ●TestInitialize制定的构建函数(如果有)
  ●测试用例
  ●TestCleanup制定的清理函数(如果有)
  ●IDisposable. Dispose函数(如果有)  
  分组:
  分组可以通过TestCategory标记:
  [TestClass,TestCategory("MS TEST V2")]
  public class TestClass
  查看方式中要选择按特征分类:
  这个标记也可以放在测试类,也可以放在测试用例上,效果不一样,请自行尝试。
   
  参数传入:
  这个是老版本的MS TEST的最大不足了,现在也可以通过DataRowAttribute指定测试用例的参数:
  [DataTestMethod]
  [DataRow(1, 2, 3)]
  [DataRow(3, 5, 8)]
  [DataRow(7, 6, 11)]
  public void AddTest(int n1, int n2, int sum)
  {
      Assert.AreEqual(sum, n1 + n2);
  }
  也可以制定多组参数,测试就会执行多次用例:
  在MS TEST V2的版本中,还可以通过ITestDataSource接口实现自定义数据源。
   
  异常测试:
  异常下现在也和xunit一样采用断言的方式捕获了。
  public void TestException()
  {
      Assert.ThrowsException<InvalidOperationException>(() => foo());
  
      void foo()
      {
          throw new InvalidOperationException();
      }
  }
   
  扩展:
  在MS TEST V2中,微软提供了一定的扩展支持,如下图所示(这些扩展也大部分支持MS TEST V1)
  具体包括如下几点:
  1.特性扩展:
  通过继承TestPropety,可以更方便的为测试用例添加描述。详情:RFC 001
  2.断言扩展:
  通过内置的断言扩展,可以更简洁的方式定制自己的断言API。详情:RFC 002
  3.执行扩展:
  MSTest V2允许我们在以下两个层级加入扩展。
  测试方法级别:允许创建自己的TestMethod特性,定制执行逻辑
  测试类级别:允许创建自己的TestClass特性,定制内部所有测试方法的执行逻辑
  详情:RFC 003
  1.数据驱动扩展:
  目前的MS TEST已经支持静态数据参数DataRow的支持,它的主要特点是:
  静态数据不能满足复杂的场景需要
  无法为多个用例共享
  如果需要更复杂的数据源,可以通过ITestDataSource接口实现。  
  小结:
  MSTEST现在也非常简单易用了。不过感觉Xunit的功能还是要多些,例如XUNIT可以暂时跳过用例,也可以修改用例名称。我这里对MS TEST V2还处于管中窥豹的阶段,后面可能会在一些项目中尝试试用一下,可能还会写一些文章继续介绍它。


上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号