摘要
我们的ERP项目代码庞大,迁移到Blazor暂时没有资源投入,还需要为ASP.NET Web Form的代码做一些改动,所以用NUnit编写大量的单元测试来加强代码质量。
准备工作
可能需要用Visual Studio Install,为Visual Studio 2022安装“旧版模板”)。
新建
测试项目初始的样子
NUnit用的是3.12.0,不是最新版。
NUnit测试适配器用的是3.16.1,也不是最新版。
测试适配器的作用,是发现测试用例。如果不引用这个包,在Visual Studio的“测试资源管理器”就看不到编写的测试用例。
发现测试用例后,效果如下:
NUnit常用特性
上述测试的类里,只有两个标签
Setup
每个Test执行的时候,都会执行一次Setup。如果你一个类里有10个Test,Setup就执行10次。
Test
这个简单,测试用例就是写在这里。
OnetimeSetup
如果一个类里有10个Test,OnetimeSetup也只执行一次。
Order
这个特性可以在class上,也可以在void上。数字越小,越优先执行。数字不必是连续的。
真实测试代码
下边是我们的登入界面用到的方法的测试。
public class Tests
{
Guid passportSessionId;
string userName = "";
string password = "";
string userLanguage = "zh-CN";
Guid applicationId = new Guid("{}");
[OneTimeSetUp]
public void Setup()
{
Yee.Configuration.GlobalConfiguration.Init(false);
Yee.Cache.Starter.Up();
Yee.ServiceContainer.Loader1.ServiceContainer.LoadUnityConfigurations();
Yee.Messages.MessageTranslator.Instance.Init();
Core.Cache.LoadMemberSites();
passportSessionId = Guid.NewGuid();
}
[Order(0)]
[Test]
public void 登入()
{
Yee.Data.Passport.SqlClient.User user = LoginManager.Current.Login(userName.Trim(),
password.Trim(), false, passportSessionId, userLanguage);
EmployeeSessionManager esm = new EmployeeSessionManager();
esm.SetCache(applicationId, passportSessionId, true);
this.userId = user.UserID;
Assert.IsNotNull(user);
}
int userId = 0;
string returnUrl = "https";
MemberSite site;
[Order(2)]
[Test]
public void 获取成员站点()
{
returnUrl = HttpUtility.UrlDecode(returnUrl);
site = Core.Cache.GetSiteInfo(returnUrl);
}
[Order(5)]
[Test]
public void 跳转到子站点()
{
Guid sessionId = Guid.NewGuid();
LoginManager.Current.EnsureUserAllowedToApplication(userId, site.ApplicationId, "EN");
SessionHelper.SaveEmployeeSession(userId, site.ApplicationId, sessionId);
EmployeeSessionManager esm = new EmployeeSessionManager();
esm.SetCache(site.UniqueId, sessionId, true);
}
}
在测试管理器中执行
调试的技巧
单个的测试用例调试不必多言。我们刚才的3个测试用例是有严格的执行顺序的,这个时候可以在测试管理器里,在类的名称上点右键,选“调试”:
后记
接下来会介绍如何用Gitlab自动执行上述测试。
黑夜里不停折腾的代码行者。