代码改变世界

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  108 随笔 :: 0 文章 :: 3 评论 :: 21942 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

摘要

我们的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   终南山人  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2023-05-27 在Directory.Build.props中用全局变量来管理包的版本号
点击右上角即可分享
微信分享提示