MSTest依赖单元测试及异步测试返回Task<T>相关问题咨询
MSTest 依赖测试与常见场景问题解答
1. 测试方法相互调用的合理性
- 不建议在测试方法里直接调用其他测试方法,该做法确实违背单元测试的核心设计原则:测试隔离。
- 单元测试要求每个测试用例只验证一个独立逻辑,测试之间不能有依赖,单个测试失败不会连带其他测试结果异常,也方便快速定位问题根因。如果测试之间存在调用关系,只要被调用的测试逻辑调整,所有依赖它的测试都会受到影响,维护成本极高。
- 单元测试原则上必须完全相互隔离,如果你测的是跨接口的链路逻辑,那属于集成测试范畴,不受这个限制,但依然不建议直接调用测试方法,而是抽取公共逻辑。
2. 跨接口依赖参数的处理方案
- 不要直接调用
TestLogin测试方法,也不要重复拷贝登录代码,最优方案是抽取公共工具方法复用相关逻辑。 - 可以单独封装一个
AuthHelper类,内部实现获取登录令牌的逻辑,TestLogin测试本身也调用这个公共方法验证登录逻辑的正确性,TestGetMembers也调用同一个公共方法拿令牌,既保证代码复用,也不会让测试用例之间产生依赖。 - 如果是单元测试场景,也可以直接Mock令牌参数,不需要真实调用登录接口,只需要验证
GetMembers的业务逻辑正确性即可,只有集成测试才需要真实调用登录接口拿令牌。
3. 全局共享令牌的存储方案
- 可以声明
static变量存储全局通用的令牌,除此之外还有更符合MSTest设计规范的方案:- 用
[ClassInitialize]标记的静态方法,在整个测试类的所有测试执行前只运行一次,在这个方法里完成登录逻辑,把令牌存在静态变量里,所有测试方法都可以直接用。 - 如果需要整个测试集(多个测试类)共享令牌,可以用
[AssemblyInitialize]标记的静态方法,在整个测试项目启动时执行一次,把令牌存在全局静态变量里即可。
- 用
- 注意如果令牌有过期时间,可以加一层判断,快过期时自动刷新即可。
4. Async测试返回值限制问题
- 这个限制确实存在,MSTest的测试方法标记了
[TestMethod]后,返回值只能是void或者Task,不能返回Task<T>,否则Test Explorer不会识别为测试用例,也不会执行。 - 不要尝试从测试方法返回值给其他测试用,本身测试方法之间就不应该有数据依赖,如果需要复用async方法的返回结果,把async逻辑抽成独立的公共异步方法,需要用到的地方直接
await调用这个公共方法拿结果即可,不要通过测试方法传递返回值。 - 如果你是想在测试里拿到异步逻辑的结果做断言,直接在测试方法内部await公共异步方法,拿到结果后再断言就行,不需要把测试方法的返回值设为
Task<T>。
内容的提问来源于stack exchange,提问作者dotNET
相关产品推荐
相关产品推荐

