@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 中没有按预期运行的主要内容,如果未能解决你的问题,请参考以下文章