首先,一个优质的项目,UT是不可或缺的一部分,起先经历的N个项目几乎都是赶功能快步前进式的开发方式,项目质量保证大部分依靠实际使用和手工测试机械点界面来排查,不仅效率低下且很难保证覆盖率等等要求。
这些理论,刚开始我其实是不以为然的,我做过很多项目,没有UT也照样能跑,业务运行也没啥问题,但是后面真正开始写UT了,发现自己代码的很多问题,脸上不屑的笑容渐渐消失……
So,我们需要来看一下ABP vNext官方文档的UT介绍。
Emmm….好吧,没有介绍……
那就只能看代码了,先看一下Abp vNext生成UT的基本项目结构吧。

首先,我们能够看到项目创建后,已经默认针对三层进行了XUnit项目的创建,并且自带一个Samples的UT示例。
先从TestBase开始,这一层貌似包含UT环境的配置以及测试数据生成,我们可以首先在这一层的XXXTestDataSeedContributor类中创建种子数据,将其创建到临时库中,每次启动UT项目测试都会创建本地临时库并生成种子数据。

不过我后面发现一开始种子数据过多会拖慢UT启动速度,这在局部UT测试的时很不友好,因此之后我仅仅把一些必要性的测试数据放到了这里,如果是某些业务UT特定需要的数据,则在业务UT构造的时候再去创建。
这里有一个疑惑的点,种子数据创建后,UT层约定如何使用它?如果使用有问题,会不会造成其他UT的断言出现失败?
比方说,AUT方法删除了一个种子数据,而BUT方法的断言则是判断返回数量为1则为true。
在这个时候,因为A删除了数据,导致B断言失败,我们是否可以认为,UT产生的种子数据仅仅是可读的?亦或者断言逻辑,必须用UT方法产生的临时数据来断言有效性?
过程当中,遇到不少问题, 有些神奇的小技巧,也是翻官方源码翻出来的,下面例举几个吧。
#在UT测试中设置当前用户
在当前UT类声明CurrentUser,覆写AfterAddApplication。

UT方法就可以设置模拟访问用户的属性了。

在UT测试中注入依赖服务
XXXService = GetRequiredService<IXXXService>(); // 这其实没啥好说的,不过可以来充数……
后面的小技巧待补充……
然后,在每个UT层,我们使用常规的XUnit特性[F

本文分享了作者从忽视UT到重视过程中的转变,详细解析了ABPvNext的UT结构、配置、策略和常见技巧,包括测试数据管理、模拟用户、依赖注入等,以及MSTest、NUnit和xUnit.net的对比和最佳实践。
最低0.47元/天 解锁文章
323

被折叠的 条评论
为什么被折叠?



