Best Kotest code snippet using io.kotest.assertions.json.print
DidServiceTest.kt
Source:DidServiceTest.kt
...50 val did = ds.create(DidMethod.key)51 val didUrl = DidUrl.from(did)52 did shouldBe didUrl.did53 "key" shouldBe didUrl.method54 print(did)55 // Resolve56 val resolvedDid = ds.resolve(did)57 val encoded = Klaxon().toJsonString(resolvedDid)58 println(encoded)59 }60 @Test61 fun createResolveDidWebTest() {62 // Create63 val did = ds.create(DidMethod.web)64 val didUrl = DidUrl.from(did)65 did shouldBe didUrl.did66 "web" shouldBe didUrl.method67 print(did)68 // Resolve69 val resolvedDid = ds.resolve(did)70 val encoded = Klaxon().toJsonString(resolvedDid)71 println(encoded)72 }73 @Test74 fun createDidEbsiV2Identifier() {75 val didUrl = DidUrl.generateDidEbsiV2DidUrl()76 val did = didUrl.did77 did.substring(0, 9) shouldBe "did:ebsi:"78 didUrl.identifier.length shouldBeOneOf listOf(23, 24)79 didUrl.identifier[0] shouldBe 'z'80 didUrl.identifier.substring(1).decodeBase58()[0] shouldBe 0x0181 didUrl.method shouldBe "ebsi"82 }83 @Test84 fun createDidEbsiTest() {85 // Create86 val keyId = keyService.generate(KeyAlgorithm.ECDSA_Secp256k1)87 val did = ds.create(DidMethod.ebsi, keyId.id)88 // Load89 val resolvedDid = ds.loadDidEbsi(did)90 val encoded = Klaxon().toJsonString(resolvedDid)91 println(encoded)92 // Update93 resolvedDid.assertionMethod = listOf(resolvedDid.verificationMethod!!.get(0).id)94 ds.updateDidEbsi(resolvedDid)95 val encodedUpd = Klaxon().toJsonString(resolvedDid)96 println(encodedUpd)97 }98 @Test99 @Ignore // TODO: ESSIF backend issue100 fun resolveDidEbsiTest() {101 val did = "did:ebsi:22S7TBCJxzPS2Vv1UniBSdzFD2ZDFjZeYvQuFQWSeAQN5nTG"102 val didDoc = DidService.resolveDidEbsi(did)103 val encDidEbsi = Klaxon().toJsonString(didDoc)104 println(encDidEbsi)105 }106 @Test107 @Ignore // TODO: ESSIF backend issue108 fun resolveDidEbsiRawTest() {109 val did = "did:ebsi:22S7TBCJxzPS2Vv1UniBSdzFD2ZDFjZeYvQuFQWSeAQN5nTG"110 val didDoc = DidService.resolveDidEbsiRaw(did)111 println(didDoc.prettyPrint())112 }113 @Test114 //ANDROID PORT115 @Ignore //Android Lazy Sodium116 //ANDROID PORT117 fun listDidsTest() {118 ds.create(DidMethod.key)119 val dids = ds.listDids()120 dids.isNotEmpty() shouldBe true121 dids.forEach { s -> s shouldBe DidUrl.from(s).did }122 }123 @Test124 fun parseDidWithSingleValueContext() {125 val didDoc = "{\n" +126 " \"@context\": \"https://www.w3.org/ns/did/v1\",\n" +127 " \"id\": \"did:ebsi:zcGvqgZTHCtkjgtcKRL7H8k\",\n" +128 " \"verificationMethod\": [\n" +129 " {\n" +130 " \"id\": \"did:ebsi:zcGvqgZTHCtkjgtcKRL7H8k#keys-1\",\n" +131 " \"type\": \"Secp256k1VerificationKey2018\",\n" +132 " \"controller\": \"did:ebsi:zcGvqgZTHCtkjgtcKRL7H8k\",\n" +133 " \"publicKeyJwk\": {\n" +134 " \"kty\": \"EC\",\n" +135 " \"crv\": \"secp256k1\",\n" +136 " \"x\": \"Iq579rsuHREntinz8NnlG_e8gDjNNQt4DbChj9mBt7Y\",\n" +137 " \"y\": \"V-Tr9B56eA7H_UJN9q6dyMWlYkQkHFvtvDDlE66LXkk\"\n" +138 " }\n" +139 " }\n" +140 " ],\n" +141 " \"authentication\": [\n" +142 " \"did:ebsi:zcGvqgZTHCtkjgtcKRL7H8k#keys-1\"\n" +143 " ],\n" +144 " \"assertionMethod\": [\n" +145 " \"did:ebsi:zcGvqgZTHCtkjgtcKRL7H8k#keys-1\"\n" +146 " ]\n" +147 "}"148 val did = Did.decode(didDoc)149 did shouldNotBe null150 did?.javaClass shouldBe DidEbsi::class.java151 println(did?.encodePretty())152 did?.encodePretty() shouldMatchJson didDoc153 }154 @Test155 fun parseDidWithContextArray() {156 val didDoc = "{\"authentication\" : [\"did:ebsi:zuffrvD4gvopW2dgTWDYTXv#87d651a26f3a416bba58770de899e8fe\"], \"@context\" : [\"https://www.w3.org/ns/did/v1\", \"https://www.w3.org/ns/did/v2\"], \"id\" : \"did:ebsi:zuffrvD4gvopW2dgTWDYTXv\", \"verificationMethod\" : [{\"controller\" : \"did:ebsi:zuffrvD4gvopW2dgTWDYTXv\", \"id\" : \"did:ebsi:zuffrvD4gvopW2dgTWDYTXv#87d651a26f3a416bba58770de899e8fe\", \"publicKeyJwk\" : {\"alg\" : \"EdDSA\", \"crv\" : \"Ed25519\", \"kid\" : \"87d651a26f3a416bba58770de899e8fe\", \"kty\" : \"OKP\", \"use\" : \"sig\", \"x\" : \"tP7zl2umgGKVMao41TkvjHBgu6EPebcnTmF9MuJqzlc\"}, \"type\" : \"Ed25519VerificationKey2018\"}]}"157 val did = Did.decode(didDoc)158 did shouldNotBe null159 did?.javaClass shouldBe DidEbsi::class.java160 println(did?.encodePretty())161 did?.encodePretty() shouldMatchJson didDoc162 }163}...
EssifCommandTest.kt
Source:EssifCommandTest.kt
...26// CLI KIT Options27//try {28// EssifOnboardingCommand().parse(listOf<String>("-h"))29//} catch (e: ProgramResult) {30// println(e.statusCode)31//} catch (e: PrintHelpMessage) {32// println(e.command.getFormattedHelp())33//} catch (e: PrintCompletionMessage) {34// println(e.message)35//} catch (e: PrintMessage) {36// println(e.message)37//} catch (e: UsageError) {38// println(e.helpMessage())39//} catch (e: CliktError) {40// println(e.message)41//} catch (e: Abort) {42// println(e.message)43//}44@OptIn(ExperimentalTime::class)45class EssifCommandTest : StringSpec({46 val bearerToken = File("data/ebsi/bearer-token.txt")47 val enableTests = bearerToken.exists()48 //ANDROID PORT49 AndroidUtils.setAndroidDataDir(System.getProperty("user.dir"))50 ServiceMatrix(FileInputStream(File("service-matrix.properties")))51 //ANDROID PORT52 // DID used for onboarding53 val key = KeyService.getService().generate(KeyAlgorithm.EdDSA_Ed25519)54 val ethKey = KeyService.getService().generate(KeyAlgorithm.ECDSA_Secp256k1)55 val did = DidService.create(DidMethod.ebsi, keyAlias = key.id)56 val identifier = DidUrl.from(did).identifier57 "onboard --help" {58 val e = shouldThrow<PrintHelpMessage> {59 EssifOnboardingCommand().parse(listOf("--help"))60 }61 val message = e.command.getFormattedHelp()62 println(message)63 message shouldContain "BEARER-TOKEN-FILE"64 message shouldContain "-d, --did"65 }66 /**67 * Before running the following tests a valid bearer token needs to be place in file data/ebsi/bearer-token.txt.68 * The token can be retrieved from https://app.preprod.ebsi.eu/users-onboarding/69 */70 "onboard --did".config(enabled = enableTests) {71 if (!bearerToken.exists()) throw Exception("Bearer Token from https://app.preprod.ebsi.eu/users-onboarding/ should be placed in file data/ebsi/bearer-token.txt")72 println("Generating verifiable authorization...")73 EssifOnboardingCommand().parse(listOf("--did", did, File("data/ebsi/bearer-token.txt").absolutePath))74 File("data/ebsi/${identifier}/verifiable-authorization.json").exists() shouldBe true75 }76 "auth-api --did".config(enabled = enableTests) {77 println("Starting auth...")78 EssifAuthCommand().parse(listOf("--did", did))79 File("data/ebsi/${identifier}/ebsi_access_token.json").exists() shouldBe true80 File("data/ebsi/${identifier}/ake1_enc.json").exists() shouldBe true81 }82 "did register --did".config(enabled = enableTests) {83 retry(9, Duration.minutes(2), delay = Duration.seconds(4)) {84 println("Registering did")85 shouldNotThrowAny {86 EssifDidRegisterCommand().parse(listOf("--did", did, "--eth-key", ethKey.id))87 }88 }89 ContextManager.hkvStore.delete(HKVKey("ebsi", identifier), true)90 }91 // TODO: ESSIF backend issue92 "essif tir get -r".config(enabled = false) {93 EssifTirGetIssuerCommand().parse(listOf("--did", "did:ebsi:224AEY73SGS1gpTvbt5TNTTPdNj8GU6NAq2AVBFmasQbntCt", "-r"))94 }95 // TODO: ESSIF backend issue96 "essif tir get -t".config(enabled = false) {97 EssifTirGetIssuerCommand().parse(listOf("--did", "did:ebsi:224AEY73SGS1gpTvbt5TNTTPdNj8GU6NAq2AVBFmasQbntCt", "-t"))98 }...
Tests.kt
Source:Tests.kt
1import databases.MariaDB2import databases.PostgreSQL3import databases.SQLite4import entities.*5import io.kotest.assertions.throwables.shouldNotThrowAny6import io.kotest.assertions.throwables.shouldThrow7import io.kotest.core.spec.style.FreeSpec8import io.kotest.matchers.nulls.shouldNotBeNull9import io.kotest.matchers.shouldBe10import statements.delete11import java.sql.SQLException12class Tests : FreeSpec({13 val databases = listOf(14 PostgreSQL(url = "jdbc:postgresql://localhost:5432/test_db", user = "user", password = "password"),15 SQLite(url = System.getenv("sqlite_url")),16 MariaDB(url = "jdbc:mariadb://localhost:3306/test_db", user = "root", password = "password")17 )18 with(Config) {19 refreshTables = true20 jsonFormat = {21 encodeDefaults = true22 }23 }24 include(utilsTests())25 databases.forEach { database ->26 "${database::class.simpleName} Tests" - {27 "Generate tables" {28 config {29 this.database = database30 setTables(::UserBooksTable, ::UsersTable, ::AddressesTable,31 ::BooksTable, ::TestTable, ::customTable)32 }33 }34 "SQL Functions" - { sqlFunctionsTests() }35 "Table Methods" - { tableMethodsTests() }36 "INSERT" - { insertTests() }37 "SELECT" - { selectTests() }38 "WHERE" - { whereTests() }39 "UPDATE" - { updateTests() }40 "References" - { referenceTests() }41 if (database !is SQLite) "Sequences" - { sequenceTests() }42 "Json Print" - { jsonPrintTests() }43 "Custom names" {44 customTable.tableName shouldBe "table_with_custom_name"45 customTable.columns.firstOrNull { it.name == "column_with_custom_name" }.shouldNotBeNull()46 shouldNotThrowAny {47 val entity = customTable[1]!!48 entity.field shouldBe "value"49 entity.update {50 field = "new_value"51 }52 customTable.delete { CustomTable::field eq "new_value" }53 customTable.size shouldBe 054 }55 }56 "Types" - { typeTests() }57 "Table Operations" - {58 val testTable = Table<Test>()59 "Clear table" {60 testTable.clearTable()61 testTable.size shouldBe 062 }63 "Drop table" {64 testTable.dropTable()65 shouldThrow<SQLException> {66 testTable.getAll()67 }68 }69 }70 Table.tables.clear()71 Column.columns.clear()72 }73 }74})...
VcVerifyCommandTest.kt
Source:VcVerifyCommandTest.kt
1package id.walt.cli2import com.github.ajalt.clikt.core.PrintHelpMessage3import id.walt.auditor.PolicyRegistry4import id.walt.custodian.Custodian5import id.walt.model.DidMethod6import id.walt.servicematrix.ServiceMatrix7//ANDROID PORT8import id.walt.servicematrix.utils.AndroidUtils9//ANDROID PORT10import id.walt.services.did.DidService11import id.walt.services.vc.JsonLdCredentialService12import id.walt.signatory.ProofConfig13import id.walt.signatory.ProofType14import id.walt.signatory.Signatory15import id.walt.test.RESOURCES_PATH16import io.kotest.assertions.throwables.shouldThrow17import io.kotest.core.spec.style.StringSpec18import io.kotest.matchers.string.shouldContain19import java.io.File20//ANDROID PORT21import java.io.FileInputStream22//ANDROID PORT23class VcVerifyCommandTest : StringSpec({24 //ANDROID PORT25 AndroidUtils.setAndroidDataDir(System.getProperty("user.dir"))26 ServiceMatrix(FileInputStream(File("$RESOURCES_PATH/service-matrix.properties")))27 //ANDROID PORT28 "vc verify --help" {29 val e = shouldThrow<PrintHelpMessage> {30 VerifyVcCommand().parse(listOf("--help"))31 }32 val message = e.command.getFormattedHelp()33 message shouldContain "Verify VC or VP"34 }35 "vc policies" {36 ListVerificationPoliciesCommand().parse(listOf())37 }38 //ANDROID PORT39 /*40 "vc verify -p SignaturePolicy path/to/vp.json" {41 val did = DidService.create(DidMethod.key)42 val vcStr = Signatory.getService().issue(43 "VerifiableDiploma", ProofConfig(issuerDid = did, subjectDid = did, issuerVerificationMethod = "Ed25519Signature2018")44 )45 val vpStr = JsonLdCredentialService.getService().present(listOf(vcStr), did, "https://api.preprod.ebsi.eu", "d04442d3-661f-411e-a80f-42f19f594c9d")46 val vpFile = File.createTempFile("vpr", ".json")47 try {48 vpFile.writeText(vpStr)49 VerifyVcCommand().parse(listOf("-p", PolicyRegistry.defaultPolicyId, vpFile.absolutePath))50 } finally {51 vpFile.delete()52 }53 }54 "vc verify -p SignaturePolicy path/to/vp.jwt" {55 val did = DidService.create(DidMethod.key)56 val vcJwt = Signatory.getService().issue(57 "VerifiableDiploma", ProofConfig(issuerDid = did, subjectDid = did, issuerVerificationMethod = "Ed25519Signature2018", proofType = ProofType.JWT)58 )59 val vpJwt = Custodian.getService().createPresentation(listOf(vcJwt), did, did, null ,"abcd")60 val vpFile = File.createTempFile("vpr", ".jwt")61 try {62 vpFile.writeText(vpJwt)63 VerifyVcCommand().parse(listOf("-p", PolicyRegistry.defaultPolicyId, vpFile.absolutePath))64 } finally {65 vpFile.delete()66 }67 }*/68 //ANDROID PORT69})...
build.gradle.kts
Source:build.gradle.kts
...34 val properties = Properties().also {35 it["version"] = project.version.toString()36 }37 File(projectDir, "src/main/resources/edu.illinois.cs.cs124.playground.server.version")38 .printWriter().use { printWriter ->39 printWriter.print(40 StringWriter().also { properties.store(it, null) }.buffer.toString()41 .lines().drop(1).joinToString(separator = "\n").trim()42 )43 }44 }45}46tasks.processResources {47 dependsOn("createProperties")48}49application {50 @Suppress("DEPRECATION")51 mainClassName = "edu.illinois.cs.cs124.playground.server.MainKt"52}53docker {...
KeyCommandTest.kt
Source:KeyCommandTest.kt
1package id.walt.cli2import com.github.ajalt.clikt.core.PrintHelpMessage3import id.walt.crypto.KeyAlgorithm4import id.walt.servicematrix.ServiceMatrix5//ANDROID PORT6import id.walt.servicematrix.utils.AndroidUtils7//ANDROID PORT8import id.walt.services.key.KeyService9import id.walt.test.RESOURCES_PATH10import io.kotest.assertions.throwables.shouldThrow11import io.kotest.core.spec.style.StringSpec12import io.kotest.matchers.string.shouldContain13//ANDROID PORT14import java.io.File15import java.io.FileInputStream16//ANDROID PORT17class KeyCommandTest : StringSpec({18 //ANDROID PORT19 AndroidUtils.setAndroidDataDir(System.getProperty("user.dir"))20 ServiceMatrix(FileInputStream(File("$RESOURCES_PATH/service-matrix.properties")))21 //ANDROID PORT22 "key gen --help" {23 val e = shouldThrow<PrintHelpMessage> {24 GenKeyCommand().parse(listOf("--help"))25 }26 val message = e.command.getFormattedHelp()27 message shouldContain "-a, --algorithm [Ed25519|Secp256k1]"28 }29 "key gen Ed25519" {30 GenKeyCommand().parse(listOf("-a", "Ed25519"))31 }32 "key gen Secp256k1" {33 GenKeyCommand().parse(listOf("-a", "Secp256k1"))34 }35 "key export Secp256k1" {36 val key = KeyService.getService().generate(KeyAlgorithm.ECDSA_Secp256k1)37 ExportKeyCommand().parse(listOf(key.id))38 }39 "key export Ed25519" {40 val key = KeyService.getService().generate(KeyAlgorithm.EdDSA_Ed25519)41 ExportKeyCommand().parse(listOf(key.id))42 }43 "key import Ed25519 priv key JWK" {44 ImportKeyCommand().parse(listOf("src/test/resources/cli/privKeyEd25519Jwk.json"))45 KeyService.getService().delete("45674a4ac169f7f4716804393d20480138a")46 }47 "key import Ed25519 pub key JWK" {48 ImportKeyCommand().parse(listOf("src/test/resources/cli/pubKeyEd25519Jwk.json"))49 KeyService.getService().delete("12374a4ac169f7f4716804393d20480138a")50 }51// Import in PEM format currently not supported52// "key import Ed25519 priv key PEM" {53// ImportKeyCommand().parse(listOf("src/test/resources/cli/privKeyEd25519Pem.txt", "src/test/resources/cli/pubKeyEd25519Pem.txt"))54// }55//56// "key import Ed25519 pub key PEM" {57// ImportKeyCommand().parse(listOf("src/test/resources/cli/pubKeyEd25519Pem.txt"))58// }59})...
DeserializationTests.kt
Source:DeserializationTests.kt
1package io.github.paulgriffith.tagkreator.model2import io.github.paulgriffith.tagkreator.json.TAG_JSON3import io.kotest.assertions.throwables.shouldNotThrowAny4import io.kotest.core.spec.DisplayName5import io.kotest.core.spec.style.FunSpec6import io.kotest.matchers.nulls.shouldNotBeNull7import io.kotest.matchers.shouldBe8import kotlinx.serialization.decodeFromString9import kotlinx.serialization.json.Json10import kotlinx.serialization.json.JsonElement11import java.io.InputStreamReader12@DisplayName("Deserialization Verification Tests")13class DeserializationTests : FunSpec() {14 private val json = Json {15 prettyPrint = true16 }17 private inline fun <reified T> assertDeserializes(resourcePath: String) {18 val stream = this::class.java.getResourceAsStream("/io/github/paulgriffith/tagkreator/model/$resourcePath.json")19 stream.shouldNotBeNull()20 val text = stream.use { resource ->21 resource.reader().use(InputStreamReader::readText)22 }23 // Make sure we can deserialize the given .json into a model type24 shouldNotThrowAny {25 TAG_JSON.decodeFromString<T>(text)26 .shouldNotBeNull()27 }28 val decoded = TAG_JSON.decodeFromString(JsonElement.serializer(), text)29 val expected = json.decodeFromString(JsonElement.serializer(), text)30 decoded shouldBe expected31 }32 init {33 test("UDT Deserialization") {34 assertDeserializes<Tag>("parentAndChild")35 }36 test("History") {37 assertDeserializes<Tag>("history")38 }39 }40}...
UserResourceTest.kt
Source:UserResourceTest.kt
1package com.github.hugovallada.user.resource2import com.github.hugovallada.errors.ErrorResponse3import com.github.hugovallada.user.dto.CreateUserRequest4import io.kotest.assertions.print.print5import io.kotest.matchers.nulls.shouldNotBeNull6import io.kotest.matchers.shouldBe7import io.kotest.matchers.shouldHave8import io.kotest.matchers.string.shouldContainIgnoringCase9import io.quarkus.test.junit.QuarkusTest10import io.restassured.RestAssured.given11import io.restassured.http.ContentType.JSON12import org.junit.jupiter.api.Test13@QuarkusTest14class UserResourceTest {15 @Test16 fun `should create an user successfully`() {17 val user = CreateUserRequest("Hugo", 25)18 given()19 .contentType(JSON)20 .body(user)21 .`when`()22 .post("/users")23 .then()24 .statusCode(201)25 .extract().response().run {26 statusCode shouldBe 20127 }28 }29 @Test30 fun `should throw a bad request exception when data is invalid`() {31 given()32 .contentType(JSON)33 .body(CreateUserRequest("", -1))34 .`when`()35 .post("/users")36 .then()37 .statusCode(400)38 .and()39 .extract()40 .asPrettyString().run {41 println(this)42 this shouldContainIgnoringCase "NotBlank"43 this shouldContainIgnoringCase "Size"44 this shouldContainIgnoringCase "Positive"45 }46 }47}...
Using AI Code Generation
1val expected = json {2}3val actual = json {4}5expected.shouldBeJson(actual)6val expected = json {7}8val actual = json {9}10expected.shouldBeJson(actual)11val expected = json {12}13val actual = json {14}15expected.shouldBeJson(actual)16val expected = json {17}18val actual = json {19}20expected.shouldBeJson(actual)21val expected = json {22}23val actual = json {24}25expected.shouldBeJson(actual)26val expected = json {27}28val actual = json {29}30expected.shouldBeJson(actual)31val expected = json {32}33val actual = json {34}35expected.shouldBeJson(actual)
Using AI Code Generation
1val expectedJson = """{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]}"""2val actualJson = """{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]}"""3print(expectedJson).isEqualToJson(actualJson)4val expectedJson = """{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]}"""5val actualJson = """{"name":"John","cars":[ "Ford", "BMW", "Fiat" ],"age":30}"""6print(expectedJson).isEqualToJsonIgnoringOrder(actualJson)7val expectedJson = """{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]}"""8val actualJson = """{"name":"John","cars":[ "Fiat", "BMW", "Ford" ],"age":30}"""9print(expectedJson).isEqualToJsonIgnoringOrderAndArrayOrder(actualJson)10val expectedJson = """{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]}"""11val actualJson = """{"name":"JOHN","cars":[ "Fiat", "BMW", "Ford" ],"age":30}"""12print(expectedJson).isEqualToJsonIgnoringOrderAndArrayOrderAndIgnoringCase(actualJson)13val expectedJson = """{"name":"John","age":30,"cars":[ "Ford", "BMW", "Fiat" ]}"""14val actualJson = """{"name":"JOHN","cars":[ "Fiat", "BMW", "Ford" ],"age":30}"""15print(expectedJson).isEqualToJsonIgnoringOrderAndArrayOrderAndIgnoringCase(actualJson)
Using AI Code Generation
1println ( json . prettyPrint ( json1 ))2println ( json . prettyPrint ( json2 ))3println ( json . prettyPrint ( json3 ))4println ( json . prettyPrint ( json4 ))5println ( json . prettyPrint ( json5 ))6println ( json . prettyPrint ( json6 ))7println ( json . prettyPrint ( json7 ))8println ( json . prettyPrint ( json8 ))9println ( json . prettyPrint ( json9 ))10println ( json . prettyPrint ( json10 ))11println ( json . prettyPrint ( json11 ))12println ( json . prettyPrint ( json12 ))13println ( json . prettyPrint ( json13 ))14println ( json . prettyPrint ( json14 ))15println ( json . prettyPrint ( json15 ))
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!!