.net MsTest使用介绍

有很多人一股脑地说MsTest不行,xUnit或者NUnit才好,好像显得很厉害的样子,反正鄙视M$系的东西在IT行业似乎就是一种政治正确。
但是你要是问他“究竟哪里不行,或者哪里不如”,他也不见得能说的上来什么,不信你试试。


先说一下,MsTest是有过进化的,曾经叫MsTest,现在最新的MsTest V2,什么时候出来的我也不知道,但应该是挺久的了。
这里说的就是MsTest V2,以前的某些关键能力没有,直接pass。

最主要的功能应该就是增加了参数化测试的支持,就是类似xUnit里面的[Fact]或者[Theory]这样的。只是在MsTest V2里面用的这个特性是[DataRow].

先上几个链接,我用的时候很多的答案就是从这里面找到的。

https://www.automatetheplanet.com/mstest-cheat-sheet/
http://www.voidcn.com/article/p-kebztovv-bsn.html
https://yq.aliyun.com/articles/354397
https://devblogs.microsoft.com/devops/taking-the-mstest-framework-forward-with-mstest-v2/


以下描述以下我现在遇到的问题以及方案

一个老项目(.net framework 4.7 MVC 或 Webform都有),想要添加单元测试。
关键点:
Q0: MsTest V2 有没有参数化测试(这个问题很关键)?
Answer:有。
关键词:[DataRow]
(下方有示例代码,先不上了)

特么的,后来经过试用发现好像只支持UWP应用,他么的。
比如我现在的 .net framework 4.6.1的普通测试项目,不支持,气死老子了

Q1.所有的单元测试开始之前或结束之后有没有一个函数,或者叫出入口呢,就类似MVC里面的start_up.cs这样的。
Answer: 有。
在单元测试项目下随便建一个class,内容如下,自己看。

namespace XueTian.Admin.Web.Test
{
    [TestClass]
    public class TestStartup
    {
        /// 
        /// 所有单元测试开始前
        /// 
        /// 
        [AssemblyInitialize]
        public static void Begin(TestContext context)
        {
          //开始前
        }


        /// 
        /// 所有单元测试结束后
        /// 
        [AssemblyCleanup]
        public static void End()
        {
            //结束后
        }
      
    }
}

备注:

  1. [AssemblyInitialize]的函数只能有一个,且参数比如是TestContext形式,[AssemblyCleanup] 同理。
  2. 他们所在的class要有 [TestClass]标记。class名称和出入口函数名就随意了。

Q2: 可否同样使用MVC或者web form项目中的web.config中的数据库配置等?
Answer:可以。
操作:
将web.config中的配置,同样地粘贴到单元测试项目下的app.config中的特定位置即可。
如下图的就是数据库连接的内容(单元测试项目中的app.config文件中)



  
      
    

  
  
   ....... 
  

想来,appSetting节点的配置也同理。
当然地,类似System.Configuration等显然是需要引用的。

Q3:如果项目中用了Ioc写法,如Calstle winsor这样的,单元测试中可以这样用吗?
Answer:可以。
我这里是这样用的,上一段示例就够了。
一处是实例注册,一处是实例应用。
TestStartup.cs(单元测试出入口)

using System;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using XueTian.Data;
using XueTian.Interface;

namespace XueTian.Admin.Web.Test
{
    [TestClass]
    public class TestStartup
    {
        public static IWindsorContainer Container { get; set; }


        /// 
        /// 所有单元测试开始前
        /// 初始化实例注册
        /// 
        /// 
        [AssemblyInitialize]
        public static void Begin(TestContext context)
        {
            Container = new WindsorContainer();

            Container.Register(
                Component.For(typeof(INewsClassRepository)).ImplementedBy(typeof(NewsClassRepository)).LifeStyle.Transient
            );
        }


        /// 
        /// 所有单元测试结束后
        /// 
        [AssemblyCleanup]
        public static void End()
        {
            //随便做点啥呢
            Console.WriteLine("所有单元测试执行结束");
        }
      
    }
}

NewsClass.cs 文件(普通业务的单元测试)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using XueTian.Interface;

namespace XueTian.Admin.Web.Test.NewsClass
{
    [TestClass]
    public class NewsClass
    {
        [DataRow(1)]
        [DataRow(719)]
        [TestMethod]
        public void TestMethod1(int classId = 719)
        {
            INewsClassRepository newsClassRepository = TestStartup.Container.Resolve();

            var aa = newsClassRepository.FindCascadedClassname(classId, "");

            Assert.IsTrue(aa.Length > 0);
        }
    }
}

如此即使用了原有项目中的IoC方式,一点都不影响,感觉非常好。


除去以上所说之外,应该没什么关键点了。

你可能感兴趣的:(.NET)