Best Kotest code snippet using io.kotest.property.arbitrary.io.kotest.property.arbitrary
RoomsKtTest.kt
Source:RoomsKtTest.kt
1package com.tylerkindy.betrayal.db2import com.tylerkindy.betrayal.Direction3import io.kotest.assertions.throwables.shouldThrow4import io.kotest.core.spec.style.DescribeSpec5import io.kotest.matchers.collections.shouldBeEmpty6import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder7import io.kotest.matchers.should8import io.kotest.matchers.shouldBe9import io.kotest.property.Arb10import io.kotest.property.Exhaustive11import io.kotest.property.arbitrary.ShortShrinker12import io.kotest.property.arbitrary.arbitrary13import io.kotest.property.arbitrary.enum14import io.kotest.property.arbitrary.set15import io.kotest.property.checkAll16import io.kotest.property.exhaustive.ints17import io.kotest.property.exhaustive.map18import io.kotest.property.forAll19import org.jetbrains.exposed.sql.insert20import org.jetbrains.exposed.sql.select21import org.jetbrains.exposed.sql.selectAll22import org.jetbrains.exposed.sql.transactions.transaction23import kotlin.random.nextInt24val directionSets = Arb.set(Arb.enum<Direction>(), 0..Direction.values().size)25val rotations = Exhaustive.ints(0..3).map { it.toShort() }26val invalidRotationValues = (Short.MIN_VALUE..Short.MAX_VALUE) - (0..3)27val invalidRotations = arbitrary(listOf(Short.MIN_VALUE, -1, 4, Short.MAX_VALUE), ShortShrinker) {28 it.random.nextInt(invalidRotationValues.indices).let { i -> invalidRotationValues[i] }.toShort()29}30class RoomsKtTest : DescribeSpec({31 useDatabase()32 describe("returnRoomToStack") {33 it("returns to empty stack") {34 transaction {35 val gameId = "ABCDEF"36 val stackId =37 RoomStacks.insert {38 it[this.gameId] = gameId39 it[curIndex] = null40 it[flipped] = false41 } get RoomStacks.id42 val roomId =43 Rooms.insert {44 it[this.gameId] = gameId45 it[roomDefId] = 1446 it[gridX] = 047 it[gridY] = 048 it[rotation] = 049 } get Rooms.id50 returnRoomToStack(gameId, roomId)51 Rooms.selectAll().shouldBeEmpty()52 val stackRows = RoomStacks.select { RoomStacks.id eq stackId }53 stackRows.count().shouldBe(1)54 stackRows.first().should {55 it[RoomStacks.curIndex].shouldBe(0)56 }57 RoomStackContents.select { RoomStackContents.stackId eq stackId }58 .first().should {59 it[RoomStackContents.index].shouldBe(0)60 it[RoomStackContents.roomDefId].shouldBe(14)61 }62 }63 }64 it("returns to non-empty stack") {65 transaction {66 val gameId = "ABCDEF"67 val stackId = RoomStacks.insert {68 it[this.gameId] = gameId69 it[curIndex] = 1770 it[flipped] = false71 } get RoomStacks.id72 RoomStackContents.insert {73 it[this.stackId] = stackId74 it[index] = 2575 it[roomDefId] = 976 }77 RoomStackContents.insert {78 it[this.stackId] = stackId79 it[index] = 1780 it[roomDefId] = 1381 }82 RoomStackContents.insert {83 it[this.stackId] = stackId84 it[index] = 385 it[roomDefId] = 2386 }87 val roomId = Rooms.insert {88 it[this.gameId] = gameId89 it[roomDefId] = 1490 it[gridX] = 091 it[gridY] = 092 it[rotation] = 093 } get Rooms.id94 returnRoomToStack(gameId, roomId)95 Rooms.selectAll().shouldBeEmpty()96 RoomStackContents.selectAll()97 .map { it[RoomStackContents.index] }98 .shouldContainExactlyInAnyOrder(0, 1, 2, 3)99 }100 }101 }102 describe("rotateDoors") {103 it("maintains number of directions") {104 forAll(directionSets, rotations) { dirs, rotation ->105 rotateDoors(dirs, rotation).size == dirs.size106 }107 }108 it("throws for invalid rotations") {109 checkAll(directionSets, invalidRotations) { dirs, rotation ->110 shouldThrow<IllegalArgumentException> { rotateDoors(dirs, rotation) }111 }112 }113 it("returns the same directions with no rotation") {114 forAll(directionSets) { dirs ->115 rotateDoors(dirs, 0) == dirs116 }117 }118 it("always returns all directions") {119 val allDirections = Direction.values().toSet()120 forAll(rotations) { rotation ->121 rotateDoors(allDirections, rotation) == allDirections122 }123 }124 it("rotates doors") {125 rotateDoors(126 setOf(Direction.NORTH, Direction.WEST),127 3128 ) shouldBe setOf(Direction.NORTH, Direction.EAST)129 }130 }131})...
CoroutineTransactionalApplicationTests.kt
Source:CoroutineTransactionalApplicationTests.kt
1package br.com.demo.coroutine_transactional2import br.com.demo.coroutine_transactional.domain.book.BookService3import br.com.demo.coroutine_transactional.domain.book.model.AuthorDefinition4import br.com.demo.coroutine_transactional.domain.book.model.BookDefinition5import br.com.demo.coroutine_transactional.persistence.PersistenceConfiguration6import br.com.demo.coroutine_transactional.persistence.repository.JPAAuthorRepository7import br.com.demo.coroutine_transactional.persistence.repository.JPABookRepository8import io.kotest.assertions.throwables.shouldThrowAny9import io.kotest.core.spec.style.StringSpec10import io.kotest.extensions.spring.SpringExtension11import io.kotest.matchers.booleans.shouldBeFalse12import io.kotest.matchers.booleans.shouldBeTrue13import io.kotest.property.Arb14import io.kotest.property.arbitrary.arbitrary15import io.kotest.property.arbitrary.bool16import io.kotest.property.arbitrary.next17import io.kotest.property.arbitrary.string18import io.kotest.property.arbitrary.uuid19import io.kotest.property.checkAll20import org.springframework.beans.factory.annotation.Autowired21import org.springframework.test.context.ContextConfiguration22@ContextConfiguration(classes = [PersistenceConfiguration::class])23class CoroutineTransactionalApplicationTests : StringSpec() {24 @Autowired25 lateinit var bookService: BookService26 @Autowired27 lateinit var jpaAuthorRepository: JPAAuthorRepository28 @Autowired29 lateinit var jpaBookRepository: JPABookRepository30 override fun extensions() = listOf(SpringExtension)31 init {32 "validate @Transactional commit/rollback behaviour when using coroutine" {33 val bookGenerator = arbitrary { rs ->34 BookDefinition(35 id = Arb.uuid().next(rs).toString(),36 isbn = Arb.string().next(rs),37 title = Arb.string().next(rs),38 author = AuthorDefinition(39 id = Arb.uuid().next(rs).toString(),40 name = Arb.uuid().next(rs).toString(),41 )42 )43 }44 checkAll(bookGenerator, Arb.bool()) { book, shouldThrows ->45 if (shouldThrows) {46 shouldThrowAny { bookService.publish(book, shouldThrows) }47 jpaAuthorRepository.existsById(book.author.id).shouldBeFalse()48 jpaBookRepository.existsById(book.id).shouldBeFalse()49 } else {50 bookService.publish(book, shouldThrows)51 jpaAuthorRepository.existsById(book.author.id).shouldBeTrue()52 jpaBookRepository.existsById(book.id).shouldBeTrue()53 }54 }55 }56 }57}...
generators.kt
Source:generators.kt
1package be.tapped.vlaamsetv2import be.tapped.goplay.profile.IdToken3import be.tapped.vlaamsetv.auth.prefs.Credential4import be.tapped.vrtnu.profile.AccessToken5import be.tapped.vrtnu.profile.Expiry6import be.tapped.vrtnu.profile.RefreshToken7import be.tapped.vrtnu.profile.TokenWrapper8import be.tapped.vrtnu.profile.XVRTToken9import be.tapped.vtmgo.profile.JWT10import io.kotest.property.Arb11import io.kotest.property.RandomSource12import io.kotest.property.arbitrary.arbitrary13import io.kotest.property.arbitrary.long14import io.kotest.property.arbitrary.string15import io.kotest.property.arbitrary.take16val vrtTokenWrapperArb: Arb<TokenWrapper> = arbitrary {17 val accessToken = AccessToken(Arb.string(minSize = 1).gen())18 val refreshToken = RefreshToken(Arb.string(minSize = 1).gen())19 val expiry = Expiry(Arb.long().gen())20 TokenWrapper(21 accessToken,22 refreshToken,23 expiry,24 )25}26val goPlayAccessTokenArb: Arb<be.tapped.goplay.profile.AccessToken> =27 arbitrary { be.tapped.goplay.profile.AccessToken(Arb.string().gen()) }28val goPlayRefreshTokenArb: Arb<be.tapped.goplay.profile.RefreshToken> =29 arbitrary { be.tapped.goplay.profile.RefreshToken(Arb.string().gen()) }30val goPlayIdTokenARb: Arb<IdToken> = arbitrary { IdToken(Arb.string().gen()) }31val goPlayTokenArb: Arb<be.tapped.goplay.profile.TokenWrapper> = arbitrary {32 val accessToken = goPlayAccessTokenArb.gen()33 val expiresIn = goPlayExpiryArb.gen()34 val tokenType = Arb.string().gen()35 val refreshToken = goPlayRefreshTokenArb.gen()36 val idToken = goPlayIdTokenARb.gen()37 be.tapped.goplay.profile.TokenWrapper(38 accessToken,39 expiresIn,40 tokenType,41 refreshToken,42 idToken,43 )44}45val goPlayExpiryArb: Arb<be.tapped.goplay.profile.Expiry> = arbitrary { be.tapped.goplay.profile.Expiry(Arb.long().gen()) }46val vtmJWTArb: Arb<JWT> = arbitrary { JWT(Arb.string().gen()) }47val expiryArb: Arb<be.tapped.vtmgo.profile.Expiry> = arbitrary { be.tapped.vtmgo.profile.Expiry(Arb.long().gen()) }48val vtmTokenWrapperArb: Arb<be.tapped.vtmgo.profile.TokenWrapper> = arbitrary {49 be.tapped.vtmgo.profile.TokenWrapper(vtmJWTArb.gen(), expiryArb.gen())50}51val xVRTTokenArb: Arb<XVRTToken> = arbitrary { XVRTToken(Arb.string().gen()) }52val vrtRefreshTokenArb: Arb<RefreshToken> = arbitrary { RefreshToken(Arb.string().gen()) }53val credentialsArb: Arb<Credential> = arbitrary { Credential(Arb.string().gen(), Arb.string().gen()) }54fun <T> Arb<T>.genList(amount: Int = 5, rs: RandomSource = RandomSource.Default): List<T> = take(amount, rs).toList()55fun <T> Arb<T>.gen(rs: RandomSource = RandomSource.Default): T = genList(1, rs).first()...
FSimplifySquareRootBigIntPropertyBasedTest.kt
Source:FSimplifySquareRootBigIntPropertyBasedTest.kt
1import io.kotest.assertions.throwables.shouldThrow2import io.kotest.core.spec.style.FunSpec3import io.kotest.matchers.should4import io.kotest.matchers.shouldBe5import io.kotest.matchers.string.startWith6import io.kotest.property.Arb7import io.kotest.property.arbitrary.arbitrary8import io.kotest.property.arbitrary.int9import io.kotest.property.arbitrary.negativeInt10import io.kotest.property.arbitrary.nonNegativeInt11import io.kotest.property.checkAll12class FSimplifySquareRootBigIntPropertyBasedTest : FunSpec({13 context("Simplification of square roots") {14 val squareRootArb = arbitrary {15 SquareRootBI(16 coefficient = Arb.nonNegativeInt().bind().toBigInteger(),17 radicand = Arb.nonNegativeInt().bind().toBigInteger()18 )19 }20 context("Simplified square root should be equal to original square root") {21 squareRootArb.checkAll { originalSquareRoot ->22 run {23 val simplifiedSquareRoot = simplifySquareRoot(originalSquareRoot)24 (simplifiedSquareRoot.coefficient.pow(2).multiply(simplifiedSquareRoot.radicand))25 .shouldBe(26 originalSquareRoot.coefficient.pow(2).multiply(originalSquareRoot.radicand)27 )28 }29 }30 }31 context("Simplified square root cannot be simplified further") {32 squareRootArb.checkAll { originalSquareRoot ->33 val simplifiedSquareRoot = simplifySquareRoot(originalSquareRoot)34 val twiceSimplifiedSquareRoot =35 simplifySquareRoot(simplifiedSquareRoot)36 simplifiedSquareRoot.coefficient shouldBe twiceSimplifiedSquareRoot.coefficient37 simplifiedSquareRoot.radicand shouldBe twiceSimplifiedSquareRoot.radicand38 }39 }40 val negativeSquareRootArb = arbitrary {41 SquareRootBI(42 coefficient = Arb.int().bind().toBigInteger(),43 radicand = Arb.negativeInt().bind().toBigInteger()44 )45 }46 context("Radicand cannot be negative") {47 negativeSquareRootArb.checkAll { squareRoot ->48 run {49 val exception = shouldThrow<IllegalArgumentException> {50 simplifySquareRoot(squareRoot)51 }52 exception.message should startWith("Radicand cannot be negative")53 }54 }55 }56 }57})...
ExampleSpec.kt
Source:ExampleSpec.kt
1package org.example2import arrow.core.Either3import arrow.optics.Traversal4import arrow.typeclasses.Monoid5import io.kotest.assertions.arrow.core.shouldBeRight6import io.kotest.core.spec.style.StringSpec7import io.kotest.matchers.shouldBe8import io.kotest.matchers.types.shouldBeTypeOf9import io.kotest.property.Arb10import io.kotest.property.arbitrary.int11import io.kotest.property.arbitrary.list12import io.kotest.property.arbitrary.map13import io.kotest.property.arbitrary.positiveInt14import io.kotest.property.arbitrary.string15import io.kotest.property.arrow.core.MonoidLaws16import io.kotest.property.arrow.core.either17import io.kotest.property.arrow.core.functionAToB18import io.kotest.property.arrow.laws.testLaws19import io.kotest.property.arrow.optics.TraversalLaws20import kotlin.jvm.JvmInline21class ExampleSpec : StringSpec({22 "true shouldBe true" {23 true shouldBe true24 }25 "exception should fail" {26 // throw RuntimeException("Boom2!")27 }28 "kotest arrow extension use-cases" {29 // smart-cast abilities for arrow types30 Either.Right("HI").shouldBeRight().shouldBeTypeOf<String>()31 }32 // utilise builtin or costume Laws with Generators to verify behavior33 testLaws(34 MonoidLaws.laws(Monoid.list(), Arb.list(Arb.string())),35 MonoidLaws.laws(Monoid.numbers(), Arb.numbers())36 )37 // optics Laws from arrow38 testLaws(39 TraversalLaws.laws(40 traversal = Traversal.either(),41 aGen = Arb.either(Arb.string(), Arb.int()),42 bGen = Arb.int(),43 funcGen = Arb.functionAToB(Arb.int()),44 )45 )46})47fun Arb.Companion.numbers(): Arb<Numbers> =48 Arb.positiveInt().map { it.toNumber() }49fun Int.toNumber(): Numbers =50 if (this <= 0) Zero else Suc(minus(1).toNumber())51// natural numbers form a monoid52fun Monoid.Companion.numbers(): Monoid<Numbers> =53 object : Monoid<Numbers> {54 override fun empty(): Numbers =55 Zero56 override fun Numbers.combine(b: Numbers): Numbers =57 Suc(b)58 }59// natural numbers60sealed interface Numbers61object Zero : Numbers62@JvmInline63value class Suc(val value: Numbers) : Numbers...
PropertyBasedTestingSpec.kt
Source:PropertyBasedTestingSpec.kt
1package sandbox.samples2import io.kotest.core.spec.style.StringSpec3import io.kotest.inspectors.forAll4import io.kotest.matchers.comparables.shouldBeGreaterThan5import io.kotest.matchers.shouldNotBe6import io.kotest.matchers.string.shouldHaveLength7import io.kotest.matchers.types.shouldBeInstanceOf8import io.kotest.property.Arb9import io.kotest.property.arbitrary.bind10import io.kotest.property.arbitrary.default11import io.kotest.property.arbitrary.positiveInts12import io.kotest.property.arbitrary.string13import io.kotest.property.checkAll14class PropertyBasedTestingSpec : StringSpec() {15 data class Person(val name: String, val age: Int)16 init {17 "can do property-based testing - with 100 examples" {18 checkAll<String, String> { a, b ->19 (a + b) shouldHaveLength(a.length + b.length)20 }21 }22 // This does not work :-(23 /*24 "can run a defined number of tests" {25 forAll(100) { a: String, b: String ->26 (a + b).length shouldBe a.length + b.length27 }28 }29 */30 "generate the defaults for list" {31 val gen = Arb.default<List<Int>>()32 checkAll(10, gen) { list ->33 list.forAll { i ->34 i.shouldBeInstanceOf<Int>()35 }36 }37 }38 "generate the defaults for set" {39 val gen = Arb.default<Set<String>>()40 checkAll(gen) { inst ->41 inst.forAll { i ->42 i.shouldBeInstanceOf<String>()43 }44 }45 }46 "string size" {47 checkAll<String, String> { a, b ->48 (a + b) shouldHaveLength(a.length + b.length)49 }50 }51 "person generator" {52 val gen = Arb.bind(Arb.string(), Arb.positiveInts(), ::Person)53 checkAll(gen) {54 it.name shouldNotBe null55 it.age shouldBeGreaterThan(0)56 }57 }58 }59}...
RestaurantItemArb.kt
Source:RestaurantItemArb.kt
1/*2 * Jopiter APP3 * Copyright (C) 2021 Leonardo Colman Lopes4 *5 * This program is free software: you can redistribute it and/or modify6 * it under the terms of the GNU Affero General Public License as published by7 * the Free Software Foundation, either version 3 of the License, or8 * (at your option) any later version.9 *10 * This program is distributed in the hope that it will be useful,11 * but WITHOUT ANY WARRANTY; without even the implied warranty of12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13 * GNU Affero General Public License for more details.14 *15 * You should have received a copy of the GNU Affero General Public License16 * along with this program. If not, see <https://www.gnu.org/licenses/>.17 */18package app.jopiter.restaurants.model19import io.kotest.property.Arb20import io.kotest.property.arbitrary.arbitrary21import io.kotest.property.arbitrary.enum22import io.kotest.property.arbitrary.int23import io.kotest.property.arbitrary.list24import io.kotest.property.arbitrary.localDate25import io.kotest.property.arbitrary.long26import io.kotest.property.arbitrary.next27import io.kotest.property.arbitrary.orNull28import io.kotest.property.arbitrary.string29val restaurantItemArb = arbitrary {30 RestaurantItem(31 Arb.int(1, 100).next(),32 Arb.localDate().next(),33 Arb.enum<Period>().next(),34 Arb.long().orNull(0.1).next(),35 Arb.string(minSize = 1).next(),36 Arb.string(minSize = 1).next(),37 Arb.string(minSize = 1).next(),38 Arb.list(Arb.string(minSize = 1)).next(),39 Arb.string(minSize = 1).next(),40 Arb.string(1, 50).next()41 )42}...
PersonGenerator.kt
Source:PersonGenerator.kt
1package property.based.testing2import io.kotest.property.Arb3import io.kotest.property.arbitrary.Codepoint4import io.kotest.property.arbitrary.ascii5import io.kotest.property.arbitrary.bind6import io.kotest.property.arbitrary.cyrillic7import io.kotest.property.arbitrary.hebrew8import io.kotest.property.arbitrary.int9import io.kotest.property.arbitrary.katakana10import io.kotest.property.arbitrary.merge11import io.kotest.property.arbitrary.string12fun Arb.Companion.person(): Arb<Person> =13 Arb.bind(14 Arb.string(15 minSize = 1, codepoints = Codepoint.ascii()16 .merge(Codepoint.katakana())17 .merge(Codepoint.hebrew())18 .merge(Codepoint.cyrillic())19 ),20 Arb.address()21 ) { name, address ->22 Person(name, address)23 }24fun Arb.Companion.address(): Arb<Address> =25 Arb.bind(26 Arb.string(minSize = 1),27 Arb.string(minSize = 1),28 Arb.int(0..20000)29 ) { street, town, zip ->30 Address(street, town, zip)31 }...
io.kotest.property.arbitrary
Using AI Code Generation
1val nullClassArb = arbitrary { rs ->2if (rs.random.nextBoolean()) null else null3}4val nullClassArb = arbitrary { rs ->5if (rs.random.nextBoolean()) null else null6}7val nullClassArb = arbitrary { rs ->8if (rs.random.nextBoolean()) null else null9}10val nullClassArb = arbitrary { rs ->11if (rs.random.nextBoolean()) null else null12}13val nullClassArb = arbitrary { rs ->14if (rs.random.nextBoolean()) null else null15}16val nullClassArb = arbitrary { rs ->17if (rs.random.nextBoolean()) null else null18}19val nullClassArb = arbitrary { rs ->20if (rs.random.nextBoolean()) null else null21}22val nullClassArb = arbitrary { rs ->23if (rs.random.nextBoolean()) null else null24}25val nullClassArb = arbitrary { rs ->26if (rs.random.nextBoolean()) null else null27}28val nullClassArb = arbitrary { rs ->29if (rs.random.nextBoolean()) null else null30}31val nullClassArb = arbitrary { rs ->32if (rs.random.nextBoolean()) null else null33}34val nullClassArb = arbitrary { rs ->35if (rs.random.nextBoolean()) null else null36}37val nullClassArb = arbitrary { rs ->38if (rs.random.nextBoolean()) null else null39}
io.kotest.property.arbitrary
Using AI Code Generation
1val nullClassArb = nullClass.arb()2val nullClassGen = nullClassArb.generator(100)3val nullClassSample = nullClassGen.next()4println(nullClassSample)5val nullClassArb = nullClass.arb()6val nullClassGen = nullClassArb.generator(100)7val nullClassSample = nullClassGen.next()8println(nullClassSample)9val nullClassArb = nullClass.arb()10val nullClassGen = nullClassArb.generator(100)11val nullClassSample = nullClassGen.next()12println(nullClassSample)13val nullClassArb = nullClass.arb()14val nullClassGen = nullClassArb.generator(100)15val nullClassSample = nullClassGen.next()16println(nullClassSample)17val nullClassArb = nullClass.arb()18val nullClassGen = nullClassArb.generator(100)19val nullClassSample = nullClassGen.next()20println(nullClassSample)21val nullClassArb = nullClass.arb()22val nullClassGen = nullClassArb.generator(100)23val nullClassSample = nullClassGen.next()24println(nullClassSample)25val nullClassArb = nullClass.arb()26val nullClassGen = nullClassArb.generator(100)27val nullClassSample = nullClassGen.next()28println(nullClassSample)29val nullClassArb = nullClass.arb()30val nullClassGen = nullClassArb.generator(100)31val nullClassSample = nullClassGen.next()32println(nullClassSample)
io.kotest.property.arbitrary
Using AI Code Generation
1import io.kotest.property.arbitrary.null2import io.kotest.property.forAll3class ExamplePropertyBasedTesting {4 fun propertyBasedTesting() {5 forAll { property: Property ->6 property.forAll { list: List<Int> ->
io.kotest.property.arbitrary
Using AI Code Generation
1val arb = Arb .nullClass ( )2val result = arb .next ( RandomSource .default ( ) )3val arb = Arb .nullClass ( )4val result = arb .next ( RandomSource .default ( ) )5val arb = Arb .nullClass ( )6val result = arb .next ( RandomSource .default ( ) )7val arb = Arb .nullClass ( )8val result = arb .next ( RandomSource .default ( ) )9val arb = Arb .nullClass ( )10val result = arb .next ( RandomSource .default ( ) )11val arb = Arb .nullClass ( )12val result = arb .next ( RandomSource .default ( ) )13val arb = Arb .nullClass ( )14val result = arb .next ( RandomSource .default ( ) )15val arb = Arb .nullClass ( )16val result = arb .next ( RandomSource .default ( ) )17val arb = Arb .nullClass ( )18val result = arb .next ( RandomSource .default ( ) )19val arb = Arb .nullClass ( )20val result = arb .next ( RandomSource .default ( ) )21val arb = Arb .nullClass ( )22val result = arb .next ( RandomSource .default ( ) )23val arb = Arb .nullClass ( )24val result = arb .next ( RandomSource .default ( ) )
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!!