Best Kotest code snippet using io.kotest.core.config.LogLevel
CoroutineLoggingInterceptorTest.kt
Source:CoroutineLoggingInterceptorTest.kt
1package com.sksamuel.kotest.engine.test.interceptors2import io.kotest.common.ExperimentalKotest3import io.kotest.core.config.LogLevel4import io.kotest.core.config.configuration5import io.kotest.core.spec.style.FunSpec6import io.kotest.core.test.TestCase7import io.kotest.engine.test.logging.LogEntry8import io.kotest.engine.test.logging.LogExtension9import io.kotest.engine.test.logging.debug10import io.kotest.engine.test.logging.error11import io.kotest.engine.test.logging.info12import io.kotest.engine.test.logging.trace13import io.kotest.engine.test.logging.warn14import io.kotest.matchers.collections.shouldBeEmpty15import io.kotest.matchers.collections.shouldContain16import io.kotest.matchers.shouldBe17import kotlin.coroutines.coroutineContext18@ExperimentalKotest19class DatabaseLogExtension : LogExtension {20 val database = mutableListOf<String>()21 override suspend fun handleLogs(testCase: TestCase, logs: List<LogEntry>) {22 database.addAll(logs.map { it.message.toString() })23 }24}25@ExperimentalKotest26object FailingLogExtension : LogExtension {27 var invoked = false28 override suspend fun handleLogs(testCase: TestCase, logs: List<LogEntry>) {29 invoked = true30 throw CannotLogException("danger zone")31 }32}33@ExperimentalKotest34class TestWithFailingLog : FunSpec() {35 init {36 register(FailingLogExtension)37 beforeTest {38 FailingLogExtension.invoked shouldBe false39 coroutineContext.configuration.logLevel = LogLevel.Debug40 }41 test("should suppress exceptions thrown by log extensions") {42 debug { "wobble" }43 }44 afterTest { FailingLogExtension.invoked shouldBe true }45 }46}47@ExperimentalKotest48class ShouldLogWithTestAndProjectLevelExtensions : FunSpec() {49 init {50 val db1 = DatabaseLogExtension()51 val db2 = DatabaseLogExtension()52 register(db1)53 beforeTest {54 coroutineContext.configuration.logLevel = LogLevel.Debug55 coroutineContext.configuration.registry.add(db2)56 }57 test("should log to project and test extensions") {58 debug { "wobble" }59 }60 afterTest {61 db1.database.shouldContain("wobble")62 db2.database.shouldContain("wobble")63 }64 }65}66@ExperimentalKotest67class TestIgnoreWhenLoggingOff : FunSpec() {68 init {69 val database = DatabaseLogExtension()70 register(database)71 beforeTest {72 coroutineContext.configuration.logLevel = LogLevel.Off73 }74 test("ignores all logs when logging is OFF by config") {75 info { "info" }76 warn { "warn" }77 error { "error" }78 debug { "debug" }79 }80 afterTest {81 database.database.shouldBeEmpty()82 }83 }84}85@ExperimentalKotest86class TestErrorLogLevel : FunSpec() {87 init {88 val database = DatabaseLogExtension()89 register(database)90 beforeTest {91 coroutineContext.configuration.logLevel = LogLevel.Error92 }93 test("ignores logs lower priority than ERROR by config") {94 info { "info" }95 warn { "warn" }96 error { "error" }97 debug { "debug" }98 trace { "trace" }99 }100 afterTest {101 database.database.shouldBe(listOf("error"))102 }103 }104}105@ExperimentalKotest106class TestDebugLogLevel : FunSpec() {107 init {108 val database = DatabaseLogExtension()109 register(database)110 beforeTest {111 coroutineContext.configuration.logLevel = LogLevel.Debug112 }113 test("ignores logs lower priority than DEBUG by config") {114 info { "info" }115 warn { "warn" }116 error { "error" }117 debug { "debug" }118 trace { "trace" }119 }120 afterTest {121 database.database.shouldBe(listOf("info", "warn", "error", "debug"))122 }123 }124}125@ExperimentalKotest126class TestTraceLogLevel : FunSpec() {127 init {128 val database = DatabaseLogExtension()129 register(database)130 beforeTest {131 coroutineContext.configuration.logLevel = LogLevel.Trace132 }133 test("ignores logs lower priority than TRACE by config") {134 info { "info" }135 warn { "warn" }136 error { "error" }137 debug { "debug" }138 trace { "trace" }139 }140 afterTest {141 database.database.shouldBe(listOf("info", "warn", "error", "debug", "trace"))142 }143 }144}145@ExperimentalKotest146class TestInfoLogLevel : FunSpec() {147 init {148 val database = DatabaseLogExtension()149 register(database)150 beforeTest {151 coroutineContext.configuration.logLevel = LogLevel.Info152 }153 test("ignores logs lower priority than INFO by config") {154 info { "info" }155 warn { "warn" }156 error { "error" }157 debug { "debug" }158 trace { "trace" }159 }160 afterTest {161 database.database.shouldBe(listOf("info", "warn", "error"))162 }163 }164}165@ExperimentalKotest166class TestWarnLogLevel : FunSpec() {167 init {168 val database = DatabaseLogExtension()169 register(database)170 beforeTest {171 coroutineContext.configuration.logLevel = LogLevel.Warn172 }173 test("ignores logs lower priority than INFO by config") {174 info { "info" }175 warn { "warn" }176 error { "error" }177 debug { "debug" }178 trace { "trace" }179 }180 afterTest {181 database.database.shouldBe(listOf("warn", "error"))182 }183 }184}185private class CannotLogException(override val message: String) : Exception()...
NaverHttpClientKtorTest.kt
Source:NaverHttpClientKtorTest.kt
1package com.hojongs.navermapskt.http.client.ktor2import com.hojongs.navermapskt.NaverClientConfig3import com.hojongs.navermapskt.geocode.Geocode4import com.hojongs.navermapskt.geocode.GeocodeRequest5import com.hojongs.navermapskt.reversegc.ReverseGCRequest6import com.hojongs.navermapskt.staticmap.StaticMapRequest7import io.kotest.assertions.throwables.*8import io.kotest.core.spec.style.*9import io.kotest.matchers.*10import io.ktor.client.features.*11import io.ktor.http.*12import kotlinx.serialization.decodeFromString13import kotlinx.serialization.json.Json14internal class NaverHttpClientKtorTest : DescribeSpec({15 fun getEnv(envName: String) =16 System.getenv(envName)17 ?: throw Exception("Env variable is required : $envName")18 val config = NaverClientConfig(19 getEnv("NAVER_MAPS_CLIENT_ID"),20 getEnv("NAVER_MAPS_CLIENT_SECRET"),21 )22 val client = NaverHttpClientKtor(config)23 afterSpec {24 client.close()25 }26 describe("geocode") {27 it("return correct geocode with status OK") {28 val geocode = client.geocode(GeocodeRequest("ë¶ë¹êµ¬ ë¶ì ë¡ 6"))29 geocode.status shouldBe "OK"30 geocode.addresses?.get(0)?.roadAddress shouldBe "경기ë ì±ë¨ì ë¶ë¹êµ¬ ë¶ì ë¡ 6 NAVER그린í©í 리"31 }32 it("throw exception with Unauthorized when client secret is invalid") {33 val config = NaverClientConfig(34 System.getenv("NAVER_MAPS_CLIENT_ID"),35 "asdfasdf"36 )37 val client = NaverHttpClientKtor(config)38 val exception = shouldThrow<ClientRequestException> {39 client.geocode(GeocodeRequest(""))40 }41 exception.response.status shouldBe HttpStatusCode.Unauthorized42 }43 it("throw exception with Unauthorized when client id and client secret are empty") {44 val config = NaverClientConfig("", "")45 val client = NaverHttpClientKtor(config)46 val exception = shouldThrow<ClientRequestException> {47 client.geocode(GeocodeRequest(""))48 }49 exception.response.status shouldBe HttpStatusCode.Unauthorized50 }51 it("error when query is empty string") {52 val geocode = client.geocode(GeocodeRequest(""))53 print(geocode)54 geocode.status shouldBe "INVALID_REQUEST"55 geocode.errorMessage shouldBe "query is INVALID"56 }57 }58 describe("reverseGeocode") {59 it("return correct response") {60 val reverseGcResponse = client.reverseGeocode(61 ReverseGCRequest(62 "129.1133567",63 "35.2982640",64 output = ReverseGCRequest.Output.JSON,65 )66 )67 reverseGcResponse.status.name shouldBe "ok"68 reverseGcResponse.results[0].let {69 it.name shouldBe "legalcode"70 it.region.area1.name shouldBe "ë¶ì°ê´ìì"71 }72 reverseGcResponse.results[1].name shouldBe "admcode"73 }74 }75 describe("staticMap") {76 it("return correct png") {77 val bytes = client.staticMap(78 StaticMapRequest(79 w = 300,80 h = 300,81 centerOrMarkers = StaticMapRequest.CenterOrMarkers.Center(82 center = "127.1054221,37.3591614",83 level = 16,84 ),85 )86 )87 val expected = javaClass88 .getResource("/staticmap.png")!!89 .readBytes()90 bytes shouldBe expected91 }92 }93 describe("json") {94 it("success decoding json") {95 // given96 val str =97 javaClass98 .getResource("/geocode.json")!!99 .readText()100 shouldNotThrow<Throwable> {101 Json.decodeFromString<Geocode>(str)102 }103 }104 }105 describe("logLevel") {106 listOf(107 "ALL",108 "HEADERS",109 "BODY",110 "INFO",111 "NONE",112 ).forEach { logLevel ->113 it("$logLevel: should work as logLevel") {114 val config = NaverClientConfig("", "")115 shouldNotThrow<IllegalArgumentException> {116 NaverHttpClientKtor(config, logLevel)117 }118 }119 }120 }121})...
build.gradle.kts
Source:build.gradle.kts
...81 showStandardStreams = false82 showPassedStandardStreams = true83 showSkippedStandardStreams = true84 showFailedStandardStreams = true85 logLevel = LogLevel.LIFECYCLE86}87// Set JVM target for Java.88java {89 toolchain.languageVersion.set(JavaLanguageVersion.of(17))90}91// Set JVM target for Kotlin.92tasks.withType<KotlinCompile>().configureEach {93 kotlinOptions {94 jvmTarget = "17"95 }96}97// Heroku Gradle buildpack runs `./gradlew stage`,98// therefore we make `stage` run `shadowJar`.99task("stage") {...
applyConfigFromSystemProperties.kt
Source:applyConfigFromSystemProperties.kt
1package io.kotest.engine.config2import io.kotest.core.config.LogLevel3import io.kotest.core.config.ProjectConfiguration4import io.kotest.core.internal.KotestEngineProperties5import io.kotest.core.names.DuplicateTestNameMode6import io.kotest.core.spec.IsolationMode7import io.kotest.core.test.AssertionMode8import io.kotest.mpp.sysprop9import io.kotest.mpp.syspropOrEnv10import kotlin.time.Duration11/**12 * Uses system properties to load configuration values onto the supplied [ProjectConfiguration] object.13 *14 * Note: This function will have no effect on non-JVM targets.15 */16internal actual fun applyConfigFromSystemProperties(configuration: ProjectConfiguration) {17 isolationMode()?.let { configuration.isolationMode = it }18 assertionMode()?.let { configuration.assertionMode = it }19 parallelism()?.let { configuration.parallelism = it }20 concurrentTests()?.let { configuration.concurrentTests = it }21 concurrentSpecs()?.let { configuration.concurrentSpecs = it }22 timeout()?.let { configuration.timeout = it }23 invocationTimeout()?.let { configuration.invocationTimeout = it }24 allowMultilineTestName()?.let { configuration.removeTestNameWhitespace = it }25 globalAssertSoftly()?.let { configuration.globalAssertSoftly = it }26 testNameAppendTags()?.let { configuration.testNameAppendTags = it }27 duplicateTestNameMode()?.let { configuration.duplicateTestNameMode = it }28 projectTimeout()?.let { configuration.projectTimeout = it }29 logLevel(configuration.logLevel).let { configuration.logLevel = it }30}31internal fun isolationMode(): IsolationMode? =32 sysprop(KotestEngineProperties.isolationMode)?.let { IsolationMode.valueOf(it) }33internal fun assertionMode(): AssertionMode? =34 sysprop(KotestEngineProperties.assertionMode)?.let { AssertionMode.valueOf(it) }35internal fun parallelism(): Int? =36 sysprop(KotestEngineProperties.parallelism)?.toInt()37internal fun timeout(): Long? =38 sysprop(KotestEngineProperties.timeout)?.toLong()39internal fun invocationTimeout(): Long? =40 sysprop(KotestEngineProperties.invocationTimeout)?.toLong()41internal fun allowMultilineTestName(): Boolean? =42 sysprop(KotestEngineProperties.allowMultilineTestName)?.let { it.uppercase() == "TRUE" }43internal fun concurrentSpecs(): Int? =44 sysprop(KotestEngineProperties.concurrentSpecs)?.toInt()45internal fun concurrentTests(): Int? =46 sysprop(KotestEngineProperties.concurrentTests)?.toInt()47internal fun globalAssertSoftly(): Boolean? =48 sysprop(KotestEngineProperties.globalAssertSoftly)?.let { it.uppercase() == "TRUE" }49internal fun testNameAppendTags(): Boolean? =50 sysprop(KotestEngineProperties.testNameAppendTags)?.let { it.uppercase() == "TRUE" }51internal fun duplicateTestNameMode(): DuplicateTestNameMode? =52 sysprop(KotestEngineProperties.duplicateTestNameMode)?.let { DuplicateTestNameMode.valueOf(it) }53internal fun projectTimeout(): Duration? {54 val d = sysprop(KotestEngineProperties.projectTimeout)?.toLong() ?: return null55 return Duration.milliseconds(d)56}57internal fun logLevel(fromConfiguration: LogLevel): LogLevel {58 val levelProp = syspropOrEnv(KotestEngineProperties.logLevel)?.let { LogLevel.from(it) }59 return levelProp ?: fromConfiguration60}...
logs.kt
Source:logs.kt
1package io.kotest.engine.test.logging2import io.kotest.common.ExperimentalKotest3import io.kotest.core.config.LogLevel4import io.kotest.core.test.TestScope5/**6 * Appends to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Trace].7 */8@ExperimentalKotest9fun TestScope.trace(message: LogFn) = logger?.maybeLog(message, LogLevel.Trace)10/**11 * Appends to the [TestLogger] reference to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Trace]12 */13@ExperimentalKotest14fun TestLogger.trace(message: LogFn) = maybeLog(message, LogLevel.Trace)15/**16 * Appends to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Debug].17 */18@ExperimentalKotest19fun TestScope.debug(message: LogFn) = logger?.maybeLog(message, LogLevel.Debug)20/**21 * Appends to the [TestLogger] reference to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Debug]22 */23@ExperimentalKotest24fun TestLogger.debug(message: LogFn) = maybeLog(message, LogLevel.Debug)25/**26 * Appends to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Info] or higher.27 */28@ExperimentalKotest29fun TestScope.info(message: LogFn) = logger?.maybeLog(message, LogLevel.Info)30/**31 * Appends to the [TestLogger] reference to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Info]32 */33@ExperimentalKotest34fun TestLogger.info(message: LogFn) = maybeLog(message, LogLevel.Info)35/**36 * Appends to the [TestScope] log, when the log level is [io.kotest.core.config.LogLevel.Warn] or higher.37 */38@ExperimentalKotest39fun TestScope.warn(message: LogFn) = logger?.maybeLog(message, LogLevel.Warn)40/**41 * Appends to the [TestLogger] reference to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Warn]42 */43@ExperimentalKotest44fun TestLogger.warn(message: LogFn) = maybeLog(message, LogLevel.Warn)45/**46 * Appends to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Error] or higher.47 */48@ExperimentalKotest49fun TestScope.error(message: LogFn) = logger?.maybeLog(message, LogLevel.Error)50/**51 * Appends to the [TestLogger] reference to the [TestScope] log, when the log level is set to [io.kotest.core.config.LogLevel.Error]52 */53@ExperimentalKotest54fun TestLogger.error(message: LogFn) = maybeLog(message, LogLevel.Error)...
ApplyConfigTest.kt
Source:ApplyConfigTest.kt
1package com.sksamuel.kotest.engine.config2import io.kotest.core.config.AbstractProjectConfig3import io.kotest.core.config.LogLevel4import io.kotest.core.config.ProjectConfiguration5import io.kotest.core.internal.KotestEngineProperties6import io.kotest.core.spec.Isolate7import io.kotest.core.spec.style.FunSpec8import io.kotest.engine.config.applyConfigFromProjectConfig9import io.kotest.engine.config.applyConfigFromSystemProperties10import io.kotest.extensions.system.OverrideMode11import io.kotest.extensions.system.withEnvironment12import io.kotest.extensions.system.withSystemProperty13import io.kotest.matchers.shouldBe14private const val key = KotestEngineProperties.logLevel15@Isolate16class ApplyConfigTest : FunSpec({17 test("log level can come from sys props") {18 val expected = LogLevel.Info19 val config = ProjectConfiguration()20 config.logLevel shouldBe LogLevel.Off21 withEnvironment(key, LogLevel.Error.name, OverrideMode.SetOrOverride) {22 withSystemProperty(key, expected.name, OverrideMode.SetOrOverride) {23 applyConfigFromSystemProperties(config)24 }25 }26 config.logLevel shouldBe expected27 }28 test("log level can come from env vars with dots in name") {29 val expected = LogLevel.Info30 val config = ProjectConfiguration()31 config.logLevel shouldBe LogLevel.Off32 withEnvironment(key, expected.name, OverrideMode.SetOrOverride) {33 applyConfigFromSystemProperties(config)34 }35 config.logLevel shouldBe expected36 }37 test("log level can come from env vars with underscores in name") {38 val expected = LogLevel.Info39 val config = ProjectConfiguration()40 config.logLevel shouldBe LogLevel.Off41 withEnvironment(key.replace('.', '_'), expected.name, OverrideMode.SetOrOverride) {42 applyConfigFromSystemProperties(config)43 }44 config.logLevel shouldBe expected45 }46 test("log level can come from AbstractProjectConfig") {47 val expected = LogLevel.Info48 val config = ProjectConfiguration()49 config.logLevel shouldBe LogLevel.Off50 applyConfigFromProjectConfig(object : AbstractProjectConfig() {51 override val logLevel = expected52 }, config)53 config.logLevel shouldBe expected54 }55})...
CoroutineLoggingInterceptor.kt
Source:CoroutineLoggingInterceptor.kt
1package io.kotest.engine.test.interceptors2import io.kotest.common.ExperimentalKotest3import io.kotest.core.config.ProjectConfiguration4import io.kotest.core.test.TestCase5import io.kotest.core.test.TestResult6import io.kotest.core.test.TestScope7import io.kotest.engine.test.TestExtensions8import io.kotest.engine.test.logging.SerialLogExtension9import io.kotest.engine.test.logging.TestLogger10import io.kotest.engine.test.logging.TestScopeLoggingCoroutineContextElement11import io.kotest.engine.test.scopes.withCoroutineContext12import io.kotest.mpp.Logger13import kotlinx.coroutines.withContext14@ExperimentalKotest15internal class CoroutineLoggingInterceptor(private val configuration: ProjectConfiguration) : TestExecutionInterceptor {16 private val logger = Logger(CoroutineLoggingInterceptor::class)17 override suspend fun intercept(18 testCase: TestCase,19 scope: TestScope,20 test: suspend (TestCase, TestScope) -> TestResult21 ): TestResult {22 val extensions = TestExtensions(configuration.registry).logExtensions(testCase)23 return when {24 configuration.logLevel.isDisabled() || extensions.isEmpty() -> {25 logger.log { Pair(testCase.name.testName, "Test logging is disabled (exts = $extensions)") }26 test(testCase, scope)27 }28 else -> {29 val logger = TestLogger(configuration.logLevel)30 withContext(TestScopeLoggingCoroutineContextElement(logger)) {31 test(testCase, scope.withCoroutineContext(coroutineContext))32 }.apply {33 extensions.map { SerialLogExtension(it) }.forEach { extension ->34 runCatching {35 extension.handleLogs(testCase, logger.logs.filter { it.level >= configuration.logLevel })36 }37 }38 }39 }40 }41 }42}...
ProjectConfig.kt
Source:ProjectConfig.kt
1@file:OptIn(ExperimentalKotest::class)2package com.lagostout.kotest.examples3import io.kotest.common.ExperimentalKotest4import io.kotest.core.config.AbstractProjectConfig5import io.kotest.core.config.LogLevel6import io.kotest.core.extensions.Extension7import io.kotest.core.test.TestCase8import io.kotest.engine.test.logging.LogEntry9import io.kotest.engine.test.logging.LogExtension10// Uncomment. Commented out to not interfere with config elsewhere, since it is project-wide.11object ProjectConfig : AbstractProjectConfig() {12 override val logLevel: LogLevel = LogLevel.Debug13 override fun extensions(): List<Extension> = listOf(14 object : LogExtension {15 override suspend fun handleLogs(testCase: TestCase, logs: List<LogEntry>) {16 logs.forEach { println(it.level.name + " - " + it.message) }17 }18 }19 )20}...
LogLevel
Using AI Code Generation
1import io.kotest.core.config.LogLevel2import io.kotest.core.spec.style.StringSpec3class MySpec : StringSpec() {4 init {5 }6}
LogLevel
Using AI Code Generation
1val logger = LoggerFactory.getLogger("com.example.MyClass")2logger.warn("This is a warning")3logger.error("This is an error")4logger.info("This is an info")5logger.debug("This is a debug message")6logger.trace("This is a trace message")7val logger = LoggerFactory.getLogger("com.example.MyClass")8logger.warn("This is a warning")9logger.error("This is an error")10logger.info("This is an info")11logger.debug("This is a debug message")12logger.trace("This is a trace message")13val logger = LoggerFactory.getLogger("com.example.MyClass")14logger.warn("This is a warning")15logger.error("This is an error")16logger.info("This is an info")17logger.debug("This is a debug message")18logger.trace("This is a trace message")19val logger = LoggerFactory.getLogger("com.example.MyClass")20logger.warn("This is a warning")21logger.error("This is an error")22logger.info("This is an info")23logger.debug("This is a debug message")24logger.trace("This is a trace message")25val logger = LoggerFactory.getLogger("com.example.MyClass")26logger.warn("This is a warning")27logger.error("This is an error")28logger.info("This is an info")29logger.debug("This is a debug message")30logger.trace("This is a trace message")31val logger = LoggerFactory.getLogger("com.example.MyClass")32logger.warn("This is a warning")33logger.error("This is an error")34logger.info("This is an info")35logger.debug("This is a debug message")36logger.trace("This is a trace message")37val logger = LoggerFactory.getLogger("com.example.MyClass")38logger.warn("This is a warning")39logger.error("This is an error")40logger.info("This is an info")41logger.debug("This is a debug message")42logger.trace("This is a trace message")43val logger = LoggerFactory.getLogger("com.example.MyClass")44logger.warn("This is a warning")45logger.error("
LogLevel
Using AI Code Generation
1val config = ProjectConfig() 2config.logLevel(LogLevel.Error) 3config.registerExtension(TimeoutExtension(1000)) 4config.registerExtension(TimeoutExceptionExtension()) 5config.registerExtension(IgnoreSpecExceptionExtension()) 6config.registerExtension(ParallelismExtension(8)) 7config.registerExtension(TimeoutExceptionExtension()) 8config.registerExtension(ParallelismExtension(8)) 9config.registerExtension(TimeoutExceptionExtension()) 10config.registerExtension(ParallelismExtension(8)) 11config.registerExtension(TimeoutExceptionExtension()) 12config.registerExtension(ParallelismExtension(8)) 13config.registerExtension(TimeoutExceptionExtension()) 14config.registerExtension(ParallelismExtension(8)) 15config.registerExtension(TimeoutExceptionExtension()) 16config.registerExtension(ParallelismExtension(8)) 17config.registerExtension(TimeoutExceptionExtension()) 18config.registerExtension(ParallelismExtension(8)) 19config.registerExtension(TimeoutExceptionExtension()) 20config.registerExtension(ParallelismExtension(8)) 21config.registerExtension(TimeoutExceptionExtension()) 22config.registerExtension(ParallelismExtension(8)) 23config.registerExtension(TimeoutExceptionExtension()) 24config.registerExtension(ParallelismExtension(8)) 25config.registerExtension(TimeoutExceptionExtension()) 26config.registerExtension(ParallelismExtension(8))27} 28}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!