Best Python code snippet using localstack_python
restore_test.py
Source:restore_test.py
1# pylint: skip-file2import io3from utilslib.dr import Restore4from utilslib.restore.strategy import NullStrategy5from botocore.stub import ANY6from botocore.response import StreamingBody7from .testutils import create_response_data, read_file8def test_restore_all_namespaces(s3_stub, mocker, datadir):9 bucket_name = 'test-bucket'10 cluster_name = 'cluster1'11 cluster_set = 'default'12 s3_stub.add_response(13 'list_objects_v2',14 expected_params={'Bucket': bucket_name, 'Prefix': "{}/{}".format(cluster_set, cluster_name)},15 service_response=STUB_LIST_RESPONSE_MULTINS16 )17 s3_stub.add_response(18 'list_objects_v2',19 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Namespace'},20 service_response=STUB_LIST_RESPONSE_KS_NS21 )22 body = read_file(datadir.join('namespace.json').strpath)23 response_stream = StreamingBody(24 io.BytesIO(body.encode()),25 len(body)26 )27 s3_stub.add_response(28 'get_object',29 expected_params={'Bucket': bucket_name, 'Key': 'default/cluster1/kube-system/Namespace/v1/kube-system.yaml'},30 service_response={'Body': response_stream}31 )32 s3_stub.add_response(33 'list_objects_v2',34 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/LimitRange'},35 service_response=STUB_LIST_RESPONSE_EMPTY36 )37 s3_stub.add_response(38 'list_objects_v2',39 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/ResourceQuota'},40 service_response=STUB_LIST_RESPONSE_EMPTY41 )42 s3_stub.add_response(43 'list_objects_v2',44 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/ConfigMap'},45 service_response=STUB_LIST_RESPONSE_EMPTY46 )47 s3_stub.add_response(48 'list_objects_v2',49 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Secret'},50 service_response=STUB_LIST_RESPONSE_EMPTY51 )52 s3_stub.add_response(53 'list_objects_v2',54 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Service'},55 service_response=STUB_LIST_RESPONSE_EMPTY56 )57 s3_stub.add_response(58 'list_objects_v2',59 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Role'},60 service_response=STUB_LIST_RESPONSE_EMPTY61 )62 s3_stub.add_response(63 'list_objects_v2',64 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/ServiceAccount'},65 service_response=STUB_LIST_RESPONSE_EMPTY66 )67 s3_stub.add_response(68 'list_objects_v2',69 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/RoleBinding'},70 service_response=STUB_LIST_RESPONSE_EMPTY71 )72 s3_stub.add_response(73 'list_objects_v2',74 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/HorizontalPodAutoscaler'},75 service_response=STUB_LIST_RESPONSE_EMPTY76 )77 s3_stub.add_response(78 'list_objects_v2',79 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Deployment'},80 service_response=STUB_LIST_RESPONSE_EMPTY81 )82 s3_stub.add_response(83 'list_objects_v2',84 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Gateway'},85 service_response=STUB_LIST_RESPONSE_EMPTY86 )87 s3_stub.add_response(88 'list_objects_v2',89 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/VirtualService'},90 service_response=STUB_LIST_RESPONSE_EMPTY91 )92 s3_stub.add_response(93 'list_objects_v2',94 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/Namespace'},95 service_response=STUB_LIST_RESPONSE_APP_NS96 )97 body = read_file(datadir.join('namespace_app1.json').strpath)98 response_stream = StreamingBody(99 io.BytesIO(body.encode()),100 len(body)101 )102 s3_stub.add_response(103 'get_object',104 expected_params={'Bucket': bucket_name, 'Key': 'default/cluster1/app1/Namespace/v1/app1.yaml'},105 service_response={'Body': response_stream}106 )107 s3_stub.add_response(108 'list_objects_v2',109 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/LimitRange'},110 service_response=STUB_LIST_RESPONSE_EMPTY111 )112 s3_stub.add_response(113 'list_objects_v2',114 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/ResourceQuota'},115 service_response=STUB_LIST_RESPONSE_EMPTY116 )117 s3_stub.add_response(118 'list_objects_v2',119 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/ConfigMap'},120 service_response=STUB_LIST_RESPONSE_EMPTY121 )122 s3_stub.add_response(123 'list_objects_v2',124 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/Secret'},125 service_response=STUB_LIST_RESPONSE_EMPTY126 )127 s3_stub.add_response(128 'list_objects_v2',129 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/Service'},130 service_response=STUB_LIST_RESPONSE_EMPTY131 )132 s3_stub.add_response(133 'list_objects_v2',134 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/Role'},135 service_response=STUB_LIST_RESPONSE_EMPTY136 )137 s3_stub.add_response(138 'list_objects_v2',139 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/ServiceAccount'},140 service_response=STUB_LIST_RESPONSE_EMPTY141 )142 s3_stub.add_response(143 'list_objects_v2',144 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/RoleBinding'},145 service_response=STUB_LIST_RESPONSE_EMPTY146 )147 s3_stub.add_response(148 'list_objects_v2',149 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/HorizontalPodAutoscaler'},150 service_response=STUB_LIST_RESPONSE_EMPTY151 )152 s3_stub.add_response(153 'list_objects_v2',154 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/Deployment'},155 service_response=STUB_LIST_RESPONSE_EMPTY156 )157 s3_stub.add_response(158 'list_objects_v2',159 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/Gateway'},160 service_response=STUB_LIST_RESPONSE_EMPTY161 )162 s3_stub.add_response(163 'list_objects_v2',164 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/VirtualService'},165 service_response=STUB_LIST_RESPONSE_EMPTY166 )167 # s3_stub.add_response(168 # 'list_objects_v2',169 # expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/app1/Namespace'},170 # service_response=STUB_LIST_RESPONSE_EMPTY171 # )172 s3_stub.activate()173 strategy = NullStrategy(cluster_name)174 restore = Restore(bucket_name,strategy,client=s3_stub.client,cluster_set=cluster_set, cluster_name=cluster_name, kube_config=datadir.join('kubeconfig').strpath)175 num_processed = restore.restore_namespaces(cluster_set, cluster_name, "*")176 assert num_processed == 2177def test_restore_single_namespaces(s3_stub, mocker, datadir):178 bucket_name = 'test-bucket'179 namespace = 'kube-system'180 cluster_name = 'cluster1'181 cluster_set = 'default'182 s3_stub.add_response(183 'list_objects_v2',184 expected_params={'Bucket': bucket_name, 'Prefix': "{}/{}".format(cluster_set, cluster_name)},185 service_response=STUB_LIST_RESPONSE_MULTINS186 )187 s3_stub.add_response(188 'list_objects_v2',189 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Namespace'},190 service_response=STUB_LIST_RESPONSE_KS_NS191 )192 body = read_file(datadir.join('namespace.json').strpath)193 response_stream = StreamingBody(194 io.BytesIO(body.encode()),195 len(body)196 )197 s3_stub.add_response(198 'get_object',199 expected_params={'Bucket': bucket_name, 'Key': 'default/cluster1/kube-system/Namespace/v1/kube-system.yaml'},200 service_response={'Body': response_stream}201 )202 s3_stub.add_response(203 'list_objects_v2',204 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/LimitRange'},205 service_response=STUB_LIST_RESPONSE_EMPTY206 )207 s3_stub.add_response(208 'list_objects_v2',209 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/ResourceQuota'},210 service_response=STUB_LIST_RESPONSE_EMPTY211 )212 s3_stub.add_response(213 'list_objects_v2',214 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/ConfigMap'},215 service_response=STUB_LIST_RESPONSE_EMPTY216 )217 s3_stub.add_response(218 'list_objects_v2',219 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Secret'},220 service_response=STUB_LIST_RESPONSE_EMPTY221 )222 s3_stub.add_response(223 'list_objects_v2',224 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Service'},225 service_response=STUB_LIST_RESPONSE_EMPTY226 )227 s3_stub.add_response(228 'list_objects_v2',229 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Role'},230 service_response=STUB_LIST_RESPONSE_EMPTY231 )232 s3_stub.add_response(233 'list_objects_v2',234 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/ServiceAccount'},235 service_response=STUB_LIST_RESPONSE_EMPTY236 )237 s3_stub.add_response(238 'list_objects_v2',239 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/RoleBinding'},240 service_response=STUB_LIST_RESPONSE_EMPTY241 )242 s3_stub.add_response(243 'list_objects_v2',244 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/HorizontalPodAutoscaler'},245 service_response=STUB_LIST_RESPONSE_EMPTY246 )247 s3_stub.add_response(248 'list_objects_v2',249 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Deployment'},250 service_response=STUB_LIST_RESPONSE_EMPTY251 )252 s3_stub.add_response(253 'list_objects_v2',254 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/Gateway'},255 service_response=STUB_LIST_RESPONSE_EMPTY256 )257 s3_stub.add_response(258 'list_objects_v2',259 expected_params={'Bucket': bucket_name, 'Prefix': 'default/cluster1/kube-system/VirtualService'},260 service_response=STUB_LIST_RESPONSE_EMPTY261 )262 s3_stub.activate()263 strategy = NullStrategy(cluster_name)264 restore = Restore(bucket_name,strategy, client=s3_stub.client, cluster_set=cluster_set, cluster_name=cluster_name, kube_config=datadir.join('kubeconfig').strpath)265 num_processed = restore.restore_namespaces(cluster_set, cluster_name, namespace)266 assert num_processed == 1267def test_restore_single_namespaces_with_prefix(s3_stub, mocker, datadir):268 bucket_name = 'test-bucket'269 namespace = 'kube-system'270 cluster_name = 'cluster2'271 cluster_set = 'default'272 prefix = 'cluster2/application-backups'273 patched = mocker.patch("kubernetes.client.apis.core_v1_api.CoreV1Api.read_namespaced_config_map", autospec=True)274 patched.return_value = create_response_data(datadir.join('clusterdata.json').strpath, 'V1ConfigMap')275 s3_stub.add_response(276 'list_objects_v2',277 expected_params={'Bucket': bucket_name, 'Prefix': "cluster2/application-backups/default/cluster2"},278 service_response=STUB_LIST_RESPONSE_MULTINS_PREFIX279 )280 s3_stub.add_response(281 'list_objects_v2',282 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/Namespace'},283 service_response=STUB_LIST_RESPONSE_KS_NS_PREFIX284 )285 body = read_file(datadir.join('namespace.json').strpath)286 response_stream = StreamingBody(287 io.BytesIO(body.encode()),288 len(body)289 )290 s3_stub.add_response(291 'get_object',292 expected_params={'Bucket': bucket_name, 'Key': 'cluster2/application-backups/default/cluster2/kube-system/Namespace/v1/kube-system.yaml'},293 service_response={'Body': response_stream}294 )295 s3_stub.add_response(296 'list_objects_v2',297 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/LimitRange'},298 service_response=STUB_LIST_RESPONSE_EMPTY299 )300 s3_stub.add_response(301 'list_objects_v2',302 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/ResourceQuota'},303 service_response=STUB_LIST_RESPONSE_EMPTY304 )305 s3_stub.add_response(306 'list_objects_v2',307 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/ConfigMap'},308 service_response=STUB_LIST_RESPONSE_EMPTY309 )310 s3_stub.add_response(311 'list_objects_v2',312 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/Secret'},313 service_response=STUB_LIST_RESPONSE_EMPTY314 )315 s3_stub.add_response(316 'list_objects_v2',317 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/Service'},318 service_response=STUB_LIST_RESPONSE_EMPTY319 )320 s3_stub.add_response(321 'list_objects_v2',322 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/Role'},323 service_response=STUB_LIST_RESPONSE_EMPTY324 )325 s3_stub.add_response(326 'list_objects_v2',327 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/ServiceAccount'},328 service_response=STUB_LIST_RESPONSE_EMPTY329 )330 s3_stub.add_response(331 'list_objects_v2',332 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/RoleBinding'},333 service_response=STUB_LIST_RESPONSE_EMPTY334 )335 s3_stub.add_response(336 'list_objects_v2',337 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/HorizontalPodAutoscaler'},338 service_response=STUB_LIST_RESPONSE_EMPTY339 )340 s3_stub.add_response(341 'list_objects_v2',342 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/Deployment'},343 service_response=STUB_LIST_RESPONSE_EMPTY344 )345 s3_stub.add_response(346 'list_objects_v2',347 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/Gateway'},348 service_response=STUB_LIST_RESPONSE_EMPTY349 )350 s3_stub.add_response(351 'list_objects_v2',352 expected_params={'Bucket': bucket_name, 'Prefix': 'cluster2/application-backups/default/cluster2/kube-system/VirtualService'},353 service_response=STUB_LIST_RESPONSE_EMPTY354 )355 s3_stub.activate()356 strategy = NullStrategy(cluster_name)357 restore = Restore(bucket_name,strategy, client=s3_stub.client, kube_config=datadir.join('kubeconfig').strpath, prefix=prefix)358 num_processed = restore.restore_namespaces(cluster_set, cluster_name, namespace)359 assert num_processed == 1360STUB_LIST_RESPONSE_MULTINS = {361 "KeyCount": 2,362 "Contents": [363 {364 "Key": "default/cluster1/kube-system/Namespace/v1/kube-system.yaml",365 "LastModified": "2020-02-06T11:48:37.000Z",366 "ETag": "2537abc",367 "Size": 1234,368 "StorageClass": "STANDARD"369 },370 {371 "Key": "default/cluster1/app1/Namespace/v1/app1.yaml",372 "LastModified": "2020-02-06T11:48:37.000Z",373 "ETag": "126abc",374 "Size": 4321,375 "StorageClass": "STANDARD"376 }377 ]378}379STUB_LIST_RESPONSE_MULTINS_PREFIX = {380 "KeyCount": 2,381 "Contents": [382 {383 "Key": "cluster2/application-backups/default/cluster2/kube-system/Namespace/v1/kube-system.yaml",384 "LastModified": "2020-02-06T11:48:37.000Z",385 "ETag": "2537abc",386 "Size": 1234,387 "StorageClass": "STANDARD"388 },389 {390 "Key": "cluster2/application-backups/default/cluster1/app1/Namespace/v1/app1.yaml",391 "LastModified": "2020-02-06T11:48:37.000Z",392 "ETag": "126abc",393 "Size": 4321,394 "StorageClass": "STANDARD"395 }396 ]397}398STUB_LIST_RESPONSE_KS_NS = {399 "KeyCount": 1,400 "Contents": [401 {402 "Key": "default/cluster1/kube-system/Namespace/v1/kube-system.yaml",403 "LastModified": "2020-02-06T11:48:37.000Z",404 "ETag": "2537abc",405 "Size": 1234,406 "StorageClass": "STANDARD"407 }408 ]409}410STUB_LIST_RESPONSE_KS_NS_PREFIX = {411 "KeyCount": 1,412 "Contents": [413 {414 "Key": "cluster2/application-backups/default/cluster2/kube-system/Namespace/v1/kube-system.yaml",415 "LastModified": "2020-02-06T11:48:37.000Z",416 "ETag": "2537abc",417 "Size": 1234,418 "StorageClass": "STANDARD"419 }420 ]421}422STUB_LIST_RESPONSE_APP_NS = {423 "KeyCount": 1,424 "Contents": [425 {426 "Key": "default/cluster1/app1/Namespace/v1/app1.yaml",427 "LastModified": "2020-02-06T11:48:37.000Z",428 "ETag": "126abc",429 "Size": 4321,430 "StorageClass": "STANDARD"431 }432 ]433}434STUB_LIST_RESPONSE_APP_NS_PREFIX = {435 "KeyCount": 1,436 "Contents": [437 {438 "Key": "cluster2/application-backups/default/cluster2/app1/Namespace/v1/app1.yaml",439 "LastModified": "2020-02-06T11:48:37.000Z",440 "ETag": "126abc",441 "Size": 4321,442 "StorageClass": "STANDARD"443 }444 ]445}446STUB_LIST_RESPONSE_EMPTY = {447 "KeyCount": 0,448 "Contents": []...
aws_s3_download_object.py
Source:aws_s3_download_object.py
...46 if key.strip() == "*":47 contents = {}48 for buck in buckets:49 maxkeys = 1000050 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys)51 contents[buck] = response['Contents']52 while response['IsTruncated']:53 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys, ContinuationToken=response['NextContinuationToken'])54 contents[buck].extend(response['Contents'])55 for buck in buckets:56 for x in contents[buck]:57 keys.append(x['Key'])58 elif key[0] == "*":59 contents = {}60 keyname = key.split("*")[1]61 for buck in buckets:62 maxkeys = 1000063 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys)64 contents[buck] = response['Contents']65 while response['IsTruncated']:66 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys, ContinuationToken=response['NextContinuationToken'])67 contents[buck].extend(response['Contents'])68 for buck in buckets:69 for x in contents[buck]:70 keys.append(x['Key'])71 elif key[-1] == "*":72 contents = {}73 keyname = key.split("*")[0]74 for buck in buckets:75 maxkeys = 1000076 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys)77 contents[buck] = response['Contents']78 while response['IsTruncated']:79 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys, ContinuationToken=response['NextContinuationToken'])80 contents[buck].extend(response['Contents'])81 for buck in buckets:82 for x in contents[buck]:83 if keyname in x['Key']:84 keys.append(x['Key'])85 else:86 contents = {}87 keyname = key.split("*")88 for buck in buckets:89 maxkeys = 1000090 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys)91 contents[buck] = response['Contents']92 while response['IsTruncated']:93 response = profile.list_objects_v2(Bucket=buck, MaxKeys=maxkeys, ContinuationToken=response['NextContinuationToken'])94 contents[buck].extend(response['Contents'])95 for buck in buckets:96 for x in contents[buck]:97 if keyname[0] in x['Key'] and keyname[1] in x['Key']:98 keys.append(x['Key'])99 else:100 keys.append(key)101 for buck in buckets:102 for file_key in keys:103 try:104 if os.path.isdir(download):105 download = "{0}/{1}".format(download, file_key)106 profile.download_file(buck, file_key, download)107 download = download.split(file_key)[0]...
BucketSerialTesting.py
Source:BucketSerialTesting.py
...57 Bucket=arg[0],58 Key=fileName459 )60 #print("Get bucket normally:")61 result = client.list_objects_v2(62 Bucket=arg[0],63 )64 # for r in result['Contents']:65 # print(r['Key'])66 #print("Get bucket photos/:")67 result = client.list_objects_v2(68 Prefix='photos/',69 Bucket=arg[0],70 )71 # for r in result['Contents']:72 # print(r['Key'])73 #print("Get bucket delimiter=/:")74 result = client.list_objects_v2(75 Delimiter='/',76 Bucket=arg[0],77 )78 # for r in result['Contents']:79 # print(r['Key'])80 #print("Get bucket MaxKeys=2:")81 result = client.list_objects_v2(82 MaxKeys=2,83 Bucket=arg[0],84 )85 # for r in result['Contents']:86 # print(r['Key'])87 #print("Get bucket Delimiter='/' & Prefix='photos/2006/':")88 result = client.list_objects_v2(89 Delimiter='/',90 Prefix='photos/2006/',91 Bucket=arg[0],92 )93 # for r in result['Contents']:94 # print(r['Key'])95 #print("\nClean up..")96 result = client.list_objects_v2(97 Bucket=arg[0],98 )99 if 'Contents' in result:100 for r in result['Contents']:101 client.delete_object(102 Bucket=arg[0],103 Key=r['Key']104 )105 client.delete_bucket(106 Bucket=arg[0],107 )108 print("Bucket Serial Test done!\n")109 except ClientError as e:110 print(e)
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!!