如何避免为所有ZIO Test Spec添加@@ TestAspect.before?
避免ZIO Test中重复添加TestAspect的几种方案
方案一:自定义基础Trait(推荐长期维护场景)
创建一个继承ZIOSpecDefault的通用Trait,内置全局前置操作,所有测试Spec只需继承该Trait并实现具体测试套件即可,无需手动重复添加Aspect。
import zio._ import zio.test._ // 通用基础测试Trait,封装全局前置操作 trait BaseSpec extends ZIOSpecDefault { // 定义全局共享的前置操作 protected val globalBeforeAspect: TestAspect[Nothing, Any, Nothing, Any] = TestAspect.before(doBeforeFunctions) // 子类仅需实现该方法,返回具体测试套件 def testSuite: Spec[TestEnvironment, Any] // 统一为所有测试套件应用前置Aspect override def spec: Spec[TestEnvironment, Any] = testSuite @@ globalBeforeAspect } // 测试Spec继承BaseSpec,无需手动添加Aspect object WorldSpec extends BaseSpec { override def testSuite = suite("HelloWorldSpec")( test("simple test") { assertTrue(1 + 1 == 2) } ) } object UniverseSpec extends BaseSpec { override def testSuite = suite("HelloUniverseSpec")( test("sayHello correctly displays output") { assertTrue(2 + 2 == 4) } ) }
方案二:在测试入口统一应用Aspect
如果所有测试通过同一个入口运行,可以在入口处将所有Spec组合,一次性为所有测试添加前置操作,无需修改单个Spec代码。
import zio._ import zio.test._ // 原有测试Spec保持不变,无需添加Aspect object WorldSpec extends ZIOSpecDefault { def spec = suite("HelloWorldSpec")( test("simple test") { assertTrue(1 + 1 == 2) } ) } object UniverseSpec extends ZIOSpecDefault { def spec = suite("HelloUniverseSpec")( test("sayHello correctly displays output") { assertTrue(2 + 2 == 4) } ) } // 测试入口,统一组合所有Spec并应用全局前置Aspect object TestMain extends ZIOAppDefault { override def run = { val allTests = WorldSpec.spec ++ UniverseSpec.spec allTests @@ TestAspect.before(doBeforeFunctions) .provideShared(ZIO.testEnvironment) .exitCode } }
方案三:封装通用Aspect变量(最小改动场景)
如果不想调整现有Spec结构,可将通用前置Aspect封装为全局变量,每个Spec直接引用该变量,减少重复代码书写。
import zio._ import zio.test._ // 封装全局共享的前置Aspect object TestSetup { val globalBeforeAspect = TestAspect.before(doBeforeFunctions) } // 测试Spec直接引用封装好的Aspect object WorldSpec extends ZIOSpecDefault { def spec = suite("HelloWorldSpec")( test("simple test") { assertTrue(1 + 1 == 2) } ) @@ TestSetup.globalBeforeAspect } object UniverseSpec extends ZIOSpecDefault { def spec = suite("HelloUniverseSpec")( test("sayHello correctly displays output") { assertTrue(2 + 2 == 4) } ) @@ TestSetup.globalBeforeAspect }
内容的提问来源于stack exchange,提问作者Dang Huy Nguyen
相关产品推荐
相关产品推荐

