@BeforeAll 在 JUnit5 中没有按预期运行

Posted

技术标签:

【中文标题】@BeforeAll 在 JUnit5 中没有按预期运行【英文标题】:@BeforeAll not functioning as intended in JUnit5 【发布时间】:2021-01-15 17:03:49 【问题描述】:

我正在使用 Appium 在 android 设备上运行 UI 测试。我们最近迁移到 JUnit5,我正在尝试使用 @BeforeAll 类来确保应用程序处于良好状态,然后再继续下一个类。 目前,Android Studio 中的 tooltip 显示该函数从未使用过。在日志中我看到junitException 说该方法必须是静态的。我还没有实现@TestInstance,现在我希望能够在没有它的情况下使用beforeAll。我只是很困惑为什么它不工作,因为我的 @beforeEach@afterEach 都在工作。错误和代码如下。

org.junit.platform.commons.JUnitException: @BeforeAll method 'public final void com.bypass.automation.BaseTest.healthcheck()' must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
open class BaseTest 

    lateinit var driver: AndroidDriver<MobileElement>
    private val capabilities = DesiredCapabilities().apply 
        setCapability(APPIUM_VERSION, "1.19.1")
        setCapability(PLATFORM_NAME, "Android")
        setCapability(DEVICE_NAME, "Android")
        setCapability("appPackage", "com.ourpackage")
        setCapability("appActivity", "com.ourpackage.PassthroughHomeActivity")
        setCapability("automationName", "uiautomator2")
        setCapability("skipDeviceInitialization", true)
        setCapability("noReset", true)
        setCapability("full-reset", false)
        setCapability("enableMultiWindows", false)
        setCapability("unlockType", "pin")
        setCapability("unlockKey", "0000")
        setCapability("newCommandTimeout", "120")
    


    @BeforeAll
    fun healthcheck() 
        val currentActivity = driver.currentActivity()
        println("Current activity is $currentActivity")
        if (currentActivity.contains("StationSecurePayActivity")) 
            println("Exiting Station Pay")
                CreditCardEntryView(driver).clickBackButton()
                
        when 
            currentActivity.contains("kiosk") -> 
                Thread.sleep(2000)
                println("Exiting Kiosk")
                KioskView(driver).exitKiosk()
                println("Logging out")
                LogInProviderUtil(driver).logOut()
            
            currentActivity != ".LoginActivity" -> 
                println("Logging out")
                LogInProviderUtil(driver).logOut()
            
            currentActivity.contains(".LoginActivity") -> 
                println("Session was properly logged out. No action taken.")
            
        
    

    @BeforeEach
    fun setup() 
        driver = AndroidDriver(URL("http://127.0.0.1:4750/wd/hub"), capabilities)
        driver.manage()?.timeouts()?.implicitlyWait(30, SECONDS)
        if (LogInProviderUtil(driver).isLoggedIn())
            LogInProviderUtil(driver).logOut()
        
    

    @AfterEach
    fun teardown() 
        if (LogInProviderUtil(driver).isLoggedIn())
            LogInProviderUtil(driver).logOut()
            driver.quit()
        
    else 
            driver.quit()
        
    


【问题讨论】:

【参考方案1】:

它会起作用的。我相信任何用@BeforeAll注释的方法都必须是静态的(除非使用“每类”测试实例生命周期)。因此,在我看来,您应该通过将此注释添加到您的测试类来切换到它:@TestInstance(Lifecycle.PER_CLASS)

此外,通常的做法是公开您的设置和拆卸方法。另外,我推荐使用 Selenium-Jupiter 框架 (https://github.com/bonigarcia/selenium-jupiter/blob/master/README.md#appium)。祝你好运。

【讨论】:

当我运行测试时,我可以看到 tit 肯定不起作用。 beforeAll 导致初始化错误,并在帖子中显示错误消息。我会尝试实现@TestInstance Static 在 Kotlin 中意味着您必须将其移动到伴随对象中并使用 @JvmStatic 对其进行注释。 这里的例子:dzone.com/articles/kotlin-and-junit-5-beforeall【参考方案2】:

如果你想有一个初始化块,你可以把它简单地放入 init 方法。而且您不必对其进行注释。

【讨论】:

以上是关于@BeforeAll 在 JUnit5 中没有按预期运行的主要内容,如果未能解决你的问题,请参考以下文章

BeforeAll 方法没有被触发

@Before、@BeforeClass、@BeforeEach 和 @BeforeAll 之间的区别

junit5常用注解

SpringBoot——单元测试之JUnit5

SpringBoot——单元测试之JUnit5

SpringBoot——单元测试之JUnit5