代码改变世界

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

摘要

我们的ERP项目代码庞大,迁移到Blazor暂时没有资源投入,还需要为ASP.NET Web Form的代码做一些改动,所以用NUnit编写大量的单元测试来加强代码质量。

准备工作

可能需要用Visual Studio Install,为Visual Studio 2022安装“旧版模板”)。

img

新建

img

img

img

测试项目初始的样子

img

NUnit用的是3.12.0,不是最新版。
NUnit测试适配器用的是3.16.1,也不是最新版。

测试适配器的作用,是发现测试用例。如果不引用这个包,在Visual Studio的“测试资源管理器”就看不到编写的测试用例。

发现测试用例后,效果如下:

img

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);
        }
    }

在测试管理器中执行

img

调试的技巧

单个的测试用例调试不必多言。我们刚才的3个测试用例是有严格的执行顺序的,这个时候可以在测试管理器里,在类的名称上点右键,选“调试”:

img

后记

接下来会介绍如何用Gitlab自动执行上述测试。

posted on 2024-05-27 14:32  终南山人  阅读(47)  评论(0编辑  收藏  举报