0
点赞
收藏
分享

微信扫一扫

.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
{
/// <summary>
/// 所有单元测试开始前
/// </summary>
/// <param name="context"></param>
[AssemblyInitialize]
public static void Begin(TestContext context)
{
//开始前
}


/// <summary>
/// 所有单元测试结束后
/// </summary>
[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文件中)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="ReadDB" connectionString="Data Source=1.1.1.1;Initial Catalog=TestRead;Persist Security Info=True;User ID=sa;Password=123456;" providerName="mssql" />
<add name="WriteDB" connectionString="Data Source=1.1.1.2;Initial Catalog=TestWrite;Persist Security Info=True;User ID=sa;Password=234567;" providerName="mssql" />

</connectionStrings>
<runtime>
.......
</runtime>
</configuration>

想来,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; }


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

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


/// <summary>
/// 所有单元测试结束后
/// </summary>
[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<INewsClassRepository>();

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

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

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

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


举报

相关推荐

0 条评论