Best Python code snippet using Airtest
test_device.py
Source:test_device.py
...12 monkeypatch.setattr(api, 'get_lvs', lambda **kwargs:13 deepcopy(volumes))14 data = {"/dev/sda": {"foo": "bar"}}15 lsblk = {"TYPE": "disk"}16 device_info(devices=data,lsblk=lsblk)17 disk = device.Device("/dev/sda")18 assert disk.sys_api19 assert "foo" in disk.sys_api20 def test_lvm_size(self, monkeypatch, device_info):21 volume = api.Volume(lv_name='lv', lv_uuid='y', vg_name='vg',22 lv_tags={}, lv_path='/dev/VolGroup/lv')23 volumes = []24 volumes.append(volume)25 monkeypatch.setattr(api, 'get_lvs', lambda **kwargs:26 deepcopy(volumes))27 # 5GB in size28 data = {"/dev/sda": {"size": "5368709120"}}29 lsblk = {"TYPE": "disk"}30 device_info(devices=data,lsblk=lsblk)31 disk = device.Device("/dev/sda")32 assert disk.lvm_size.gb == 433 def test_lvm_size_rounds_down(self, device_info):34 # 5.5GB in size35 data = {"/dev/sda": {"size": "5905580032"}}36 lsblk = {"TYPE": "disk"}37 device_info(devices=data,lsblk=lsblk)38 disk = device.Device("/dev/sda")39 assert disk.lvm_size.gb == 440 def test_is_lv(self, device_info):41 data = {"lv_path": "vg/lv", "vg_name": "vg", "name": "lv"}42 lsblk = {"TYPE": "lvm"}43 device_info(lv=data,lsblk=lsblk)44 disk = device.Device("vg/lv")45 assert disk.is_lv46 def test_vgs_is_empty(self, device_info, monkeypatch):47 BarPVolume = api.PVolume(pv_name='/dev/sda', pv_uuid="0000",48 pv_tags={})49 pvolumes = []50 pvolumes.append(BarPVolume)51 lsblk = {"TYPE": "disk"}52 device_info(lsblk=lsblk)53 monkeypatch.setattr(api, 'get_pvs', lambda **kwargs: {})54 disk = device.Device("/dev/nvme0n1")55 assert disk.vgs == []56 def test_vgs_is_not_empty(self, device_info, monkeypatch):57 vg = api.VolumeGroup(vg_name='foo/bar', vg_free_count=6,58 vg_extent_size=1073741824)59 monkeypatch.setattr(api, 'get_device_vgs', lambda x: [vg])60 lsblk = {"TYPE": "disk"}61 device_info(lsblk=lsblk)62 disk = device.Device("/dev/nvme0n1")63 assert len(disk.vgs) == 164 def test_device_is_device(self, device_info):65 data = {"/dev/sda": {"foo": "bar"}}66 lsblk = {"TYPE": "device"}67 device_info(devices=data, lsblk=lsblk)68 disk = device.Device("/dev/sda")69 assert disk.is_device is True70 def test_device_is_rotational(self, device_info):71 data = {"/dev/sda": {"rotational": "1"}}72 lsblk = {"TYPE": "device"}73 device_info(devices=data, lsblk=lsblk)74 disk = device.Device("/dev/sda")75 assert disk.rotational76 def test_device_is_not_rotational(self, device_info):77 data = {"/dev/sda": {"rotational": "0"}}78 lsblk = {"TYPE": "device"}79 device_info(devices=data, lsblk=lsblk)80 disk = device.Device("/dev/sda")81 assert not disk.rotational82 def test_device_is_rotational_lsblk(self, device_info):83 data = {"/dev/sda": {"foo": "bar"}}84 lsblk = {"TYPE": "device", "ROTA": "1"}85 device_info(devices=data, lsblk=lsblk)86 disk = device.Device("/dev/sda")87 assert disk.rotational88 def test_device_is_not_rotational_lsblk(self, device_info):89 data = {"/dev/sda": {"rotational": "0"}}90 lsblk = {"TYPE": "device", "ROTA": "0"}91 device_info(devices=data, lsblk=lsblk)92 disk = device.Device("/dev/sda")93 assert not disk.rotational94 def test_device_is_rotational_defaults_true(self, device_info):95 # rotational will default true if no info from sys_api or lsblk is found96 data = {"/dev/sda": {"foo": "bar"}}97 lsblk = {"TYPE": "device", "foo": "bar"}98 device_info(devices=data, lsblk=lsblk)99 disk = device.Device("/dev/sda")100 assert disk.rotational101 def test_disk_is_device(self, device_info):102 data = {"/dev/sda": {"foo": "bar"}}103 lsblk = {"TYPE": "disk"}104 device_info(devices=data, lsblk=lsblk)105 disk = device.Device("/dev/sda")106 assert disk.is_device is True107 def test_is_partition(self, device_info):108 data = {"/dev/sda1": {"foo": "bar"}}109 lsblk = {"TYPE": "part", "PKNAME": "sda"}110 device_info(devices=data, lsblk=lsblk)111 disk = device.Device("/dev/sda1")112 assert disk.is_partition113 def test_mpath_device_is_device(self, device_info):114 data = {"/dev/foo": {"foo": "bar"}}115 lsblk = {"TYPE": "mpath"}116 device_info(devices=data, lsblk=lsblk)117 disk = device.Device("/dev/foo")118 assert disk.is_device is True119 def test_is_not_lvm_member(self, device_info):120 data = {"/dev/sda1": {"foo": "bar"}}121 lsblk = {"TYPE": "part", "PKNAME": "sda"}122 device_info(devices=data, lsblk=lsblk)123 disk = device.Device("/dev/sda1")124 assert not disk.is_lvm_member125 def test_is_lvm_member(self, device_info):126 data = {"/dev/sda1": {"foo": "bar"}}127 lsblk = {"TYPE": "part", "PKNAME": "sda"}128 device_info(devices=data, lsblk=lsblk)129 disk = device.Device("/dev/sda1")130 assert not disk.is_lvm_member131 def test_is_mapper_device(self, device_info):132 lsblk = {"TYPE": "lvm"}133 device_info(lsblk=lsblk)134 disk = device.Device("/dev/mapper/foo")135 assert disk.is_mapper136 def test_dm_is_mapper_device(self, device_info):137 lsblk = {"TYPE": "lvm"}138 device_info(lsblk=lsblk)139 disk = device.Device("/dev/dm-4")140 assert disk.is_mapper141 def test_is_not_mapper_device(self, device_info):142 lsblk = {"TYPE": "disk"}143 device_info(lsblk=lsblk)144 disk = device.Device("/dev/sda")145 assert not disk.is_mapper146 @pytest.mark.usefixtures("lsblk_ceph_disk_member",147 "disable_kernel_queries")148 def test_is_ceph_disk_lsblk(self, monkeypatch, patch_bluestore_label):149 disk = device.Device("/dev/sda")150 assert disk.is_ceph_disk_member151 @pytest.mark.usefixtures("blkid_ceph_disk_member",152 "disable_kernel_queries")153 def test_is_ceph_disk_blkid(self, monkeypatch, patch_bluestore_label):154 disk = device.Device("/dev/sda")155 assert disk.is_ceph_disk_member156 @pytest.mark.usefixtures("lsblk_ceph_disk_member",157 "disable_kernel_queries")158 def test_is_ceph_disk_member_not_available_lsblk(self, monkeypatch, patch_bluestore_label):159 disk = device.Device("/dev/sda")160 assert disk.is_ceph_disk_member161 assert not disk.available162 assert "Used by ceph-disk" in disk.rejected_reasons163 @pytest.mark.usefixtures("blkid_ceph_disk_member",164 "disable_kernel_queries")165 def test_is_ceph_disk_member_not_available_blkid(self, monkeypatch, patch_bluestore_label):166 disk = device.Device("/dev/sda")167 assert disk.is_ceph_disk_member168 assert not disk.available169 assert "Used by ceph-disk" in disk.rejected_reasons170 def test_reject_removable_device(self, device_info):171 data = {"/dev/sdb": {"removable": 1}}172 lsblk = {"TYPE": "disk"}173 device_info(devices=data,lsblk=lsblk)174 disk = device.Device("/dev/sdb")175 assert not disk.available176 def test_reject_device_with_gpt_headers(self, device_info):177 data = {"/dev/sdb": {"removable": 0, "size": 5368709120}}178 lsblk = {"TYPE": "disk"}179 blkid= {"PTTYPE": "gpt"}180 device_info(181 devices=data,182 blkid=blkid,183 lsblk=lsblk,184 )185 disk = device.Device("/dev/sdb")186 assert not disk.available187 def test_accept_non_removable_device(self, device_info):188 data = {"/dev/sdb": {"removable": 0, "size": 5368709120}}189 lsblk = {"TYPE": "disk"}190 device_info(devices=data,lsblk=lsblk)191 disk = device.Device("/dev/sdb")192 assert disk.available193 def test_reject_not_acceptable_device(self, device_info):194 data = {"/dev/dm-0": {"foo": "bar"}}195 lsblk = {"TYPE": "mpath"}196 device_info(devices=data, lsblk=lsblk)197 disk = device.Device("/dev/dm-0")198 assert not disk.available199 def test_reject_readonly_device(self, device_info):200 data = {"/dev/cdrom": {"ro": 1}}201 lsblk = {"TYPE": "disk"}202 device_info(devices=data,lsblk=lsblk)203 disk = device.Device("/dev/cdrom")204 assert not disk.available205 def test_reject_smaller_than_5gb(self, device_info):206 data = {"/dev/sda": {"size": 5368709119}}207 lsblk = {"TYPE": "disk"}208 device_info(devices=data,lsblk=lsblk)209 disk = device.Device("/dev/sda")210 assert not disk.available, 'too small device is available'211 def test_accept_non_readonly_device(self, device_info):212 data = {"/dev/sda": {"ro": 0, "size": 5368709120}}213 lsblk = {"TYPE": "disk"}214 device_info(devices=data,lsblk=lsblk)215 disk = device.Device("/dev/sda")216 assert disk.available217 def test_reject_bluestore_device(self, monkeypatch, patch_bluestore_label, device_info):218 patch_bluestore_label.return_value = True219 lsblk = {"TYPE": "disk"}220 device_info(lsblk=lsblk)221 disk = device.Device("/dev/sda")222 assert not disk.available223 assert "Has BlueStore device label" in disk.rejected_reasons224 def test_reject_device_with_oserror(self, monkeypatch, patch_bluestore_label, device_info):225 patch_bluestore_label.side_effect = OSError('test failure')226 lsblk = {"TYPE": "disk"}227 device_info(lsblk=lsblk)228 disk = device.Device("/dev/sda")229 assert not disk.available230 assert "Failed to determine if device is BlueStore" in disk.rejected_reasons231 @pytest.mark.usefixtures("device_info_not_ceph_disk_member",232 "disable_kernel_queries")233 def test_is_not_ceph_disk_member_lsblk(self, patch_bluestore_label):234 disk = device.Device("/dev/sda")235 assert disk.is_ceph_disk_member is False236 def test_existing_vg_available(self, monkeypatch, device_info):237 vg = api.VolumeGroup(vg_name='foo/bar', vg_free_count=1536,238 vg_extent_size=4194304)239 monkeypatch.setattr(api, 'get_device_vgs', lambda x: [vg])240 lsblk = {"TYPE": "disk"}241 data = {"/dev/nvme0n1": {"size": "6442450944"}}242 device_info(devices=data, lsblk=lsblk)243 disk = device.Device("/dev/nvme0n1")244 assert disk.available_lvm245 assert not disk.available246 assert not disk.available_raw247 def test_existing_vg_too_small(self, monkeypatch, device_info):248 vg = api.VolumeGroup(vg_name='foo/bar', vg_free_count=4,249 vg_extent_size=1073741824)250 monkeypatch.setattr(api, 'get_device_vgs', lambda x: [vg])251 lsblk = {"TYPE": "disk"}252 data = {"/dev/nvme0n1": {"size": "6442450944"}}253 device_info(devices=data, lsblk=lsblk)254 disk = device.Device("/dev/nvme0n1")255 assert not disk.available_lvm256 assert not disk.available257 assert not disk.available_raw258 def test_multiple_existing_vgs(self, monkeypatch, device_info):259 vg1 = api.VolumeGroup(vg_name='foo/bar', vg_free_count=1000,260 vg_extent_size=4194304)261 vg2 = api.VolumeGroup(vg_name='foo/bar', vg_free_count=536,262 vg_extent_size=4194304)263 monkeypatch.setattr(api, 'get_device_vgs', lambda x: [vg1, vg2])264 lsblk = {"TYPE": "disk"}265 data = {"/dev/nvme0n1": {"size": "6442450944"}}266 device_info(devices=data, lsblk=lsblk)267 disk = device.Device("/dev/nvme0n1")268 assert disk.available_lvm269 assert not disk.available270 assert not disk.available_raw271 @pytest.mark.parametrize("ceph_type", ["data", "block"])272 def test_used_by_ceph(self, device_info,273 monkeypatch, ceph_type):274 data = {"/dev/sda": {"foo": "bar"}}275 lsblk = {"TYPE": "part", "PKNAME": "sda"}276 FooPVolume = api.PVolume(pv_name='/dev/sda', pv_uuid="0000",277 lv_uuid="0000", pv_tags={}, vg_name="vg")278 pvolumes = []279 pvolumes.append(FooPVolume)280 lv_data = {"lv_name": "lv", "lv_path": "vg/lv", "vg_name": "vg",281 "lv_uuid": "0000", "lv_tags":282 "ceph.osd_id=0,ceph.type="+ceph_type}283 volumes = []284 lv = api.Volume(**lv_data)285 volumes.append(lv)286 monkeypatch.setattr(api, 'get_pvs', lambda **kwargs: pvolumes)287 monkeypatch.setattr(api, 'get_lvs', lambda **kwargs:288 deepcopy(volumes))289 device_info(devices=data, lsblk=lsblk, lv=lv_data)290 vg = api.VolumeGroup(vg_name='foo/bar', vg_free_count=6,291 vg_extent_size=1073741824)292 monkeypatch.setattr(api, 'get_device_vgs', lambda x: [vg])293 disk = device.Device("/dev/sda")294 assert disk.used_by_ceph295 def test_not_used_by_ceph(self, device_info, monkeypatch):296 FooPVolume = api.PVolume(pv_name='/dev/sda', pv_uuid="0000", lv_uuid="0000", pv_tags={}, vg_name="vg")297 pvolumes = []298 pvolumes.append(FooPVolume)299 data = {"/dev/sda": {"foo": "bar"}}300 lsblk = {"TYPE": "part", "PKNAME": "sda"}301 lv_data = {"lv_path": "vg/lv", "vg_name": "vg", "lv_uuid": "0000", "tags": {"ceph.osd_id": 0, "ceph.type": "journal"}}302 monkeypatch.setattr(api, 'get_pvs', lambda **kwargs: pvolumes)303 device_info(devices=data, lsblk=lsblk, lv=lv_data)304 disk = device.Device("/dev/sda")305 assert not disk.used_by_ceph306 def test_get_device_id(self, device_info):307 udev = {k:k for k in ['ID_VENDOR', 'ID_MODEL', 'ID_SCSI_SERIAL']}308 lsblk = {"TYPE": "disk"}309 device_info(udevadm=udev,lsblk=lsblk)310 disk = device.Device("/dev/sda")311 assert disk._get_device_id() == 'ID_VENDOR_ID_MODEL_ID_SCSI_SERIAL'312 def test_has_bluestore_label(self):313 # patch device.Device __init__ function to do nothing since we want to only test the314 # low-level behavior of has_bluestore_label315 with patch.object(device.Device, "__init__", lambda self, path, with_lsm=False: None):316 disk = device.Device("/dev/sda")317 disk.abspath = "/dev/sda"318 with patch('builtins.open', mock_open(read_data=b'bluestore block device\n')):319 assert disk.has_bluestore_label320 with patch('builtins.open', mock_open(read_data=b'not a bluestore block device\n')):321 assert not disk.has_bluestore_label322class TestDeviceEncryption(object):323 def test_partition_is_not_encrypted_lsblk(self, device_info):324 lsblk = {'TYPE': 'part', 'FSTYPE': 'xfs', 'PKNAME': 'sda'}325 device_info(lsblk=lsblk)326 disk = device.Device("/dev/sda")327 assert disk.is_encrypted is False328 def test_partition_is_encrypted_lsblk(self, device_info):329 lsblk = {'TYPE': 'part', 'FSTYPE': 'crypto_LUKS', 'PKNAME': 'sda'}330 device_info(lsblk=lsblk)331 disk = device.Device("/dev/sda")332 assert disk.is_encrypted is True333 def test_partition_is_not_encrypted_blkid(self, device_info):334 lsblk = {'TYPE': 'part', 'PKNAME': 'sda'}335 blkid = {'TYPE': 'ceph data'}336 device_info(lsblk=lsblk, blkid=blkid)337 disk = device.Device("/dev/sda")338 assert disk.is_encrypted is False339 def test_partition_is_encrypted_blkid(self, device_info):340 lsblk = {'TYPE': 'part', 'PKNAME': 'sda'}341 blkid = {'TYPE': 'crypto_LUKS'}342 device_info(lsblk=lsblk, blkid=blkid)343 disk = device.Device("/dev/sda")344 assert disk.is_encrypted is True345 def test_mapper_is_encrypted_luks1(self, device_info, monkeypatch):346 status = {'type': 'LUKS1'}347 monkeypatch.setattr(device, 'encryption_status', lambda x: status)348 lsblk = {'FSTYPE': 'xfs', 'TYPE': 'lvm'}349 blkid = {'TYPE': 'mapper'}350 device_info(lsblk=lsblk, blkid=blkid)351 disk = device.Device("/dev/mapper/uuid")352 assert disk.is_encrypted is True353 def test_mapper_is_encrypted_luks2(self, device_info, monkeypatch):354 status = {'type': 'LUKS2'}355 monkeypatch.setattr(device, 'encryption_status', lambda x: status)356 lsblk = {'FSTYPE': 'xfs', 'TYPE': 'lvm'}357 blkid = {'TYPE': 'mapper'}358 device_info(lsblk=lsblk, blkid=blkid)359 disk = device.Device("/dev/mapper/uuid")360 assert disk.is_encrypted is True361 def test_mapper_is_encrypted_plain(self, device_info, monkeypatch):362 status = {'type': 'PLAIN'}363 monkeypatch.setattr(device, 'encryption_status', lambda x: status)364 lsblk = {'FSTYPE': 'xfs', 'TYPE': 'lvm'}365 blkid = {'TYPE': 'mapper'}366 device_info(lsblk=lsblk, blkid=blkid)367 disk = device.Device("/dev/mapper/uuid")368 assert disk.is_encrypted is True369 def test_mapper_is_not_encrypted_plain(self, device_info, monkeypatch):370 monkeypatch.setattr(device, 'encryption_status', lambda x: {})371 lsblk = {'FSTYPE': 'xfs', 'TYPE': 'lvm'}372 blkid = {'TYPE': 'mapper'}373 device_info(lsblk=lsblk, blkid=blkid)374 disk = device.Device("/dev/mapper/uuid")375 assert disk.is_encrypted is False376 def test_lv_is_encrypted_blkid(self, device_info):377 lsblk = {'TYPE': 'lvm'}378 blkid = {'TYPE': 'crypto_LUKS'}379 device_info(lsblk=lsblk, blkid=blkid)380 disk = device.Device("/dev/sda")381 disk.lv_api = {}382 assert disk.is_encrypted is True383 def test_lv_is_not_encrypted_blkid(self, factory, device_info):384 lsblk = {'TYPE': 'lvm'}385 blkid = {'TYPE': 'xfs'}386 device_info(lsblk=lsblk, blkid=blkid)387 disk = device.Device("/dev/sda")388 disk.lv_api = factory(encrypted=None)389 assert disk.is_encrypted is False390 def test_lv_is_encrypted_lsblk(self, device_info):391 lsblk = {'FSTYPE': 'crypto_LUKS', 'TYPE': 'lvm'}392 blkid = {'TYPE': 'mapper'}393 device_info(lsblk=lsblk, blkid=blkid)394 disk = device.Device("/dev/sda")395 disk.lv_api = {}396 assert disk.is_encrypted is True397 def test_lv_is_not_encrypted_lsblk(self, factory, device_info):398 lsblk = {'FSTYPE': 'xfs', 'TYPE': 'lvm'}399 blkid = {'TYPE': 'mapper'}400 device_info(lsblk=lsblk, blkid=blkid)401 disk = device.Device("/dev/sda")402 disk.lv_api = factory(encrypted=None)403 assert disk.is_encrypted is False404 def test_lv_is_encrypted_lvm_api(self, factory, device_info):405 lsblk = {'FSTYPE': 'xfs', 'TYPE': 'lvm'}406 blkid = {'TYPE': 'mapper'}407 device_info(lsblk=lsblk, blkid=blkid)408 disk = device.Device("/dev/sda")409 disk.lv_api = factory(encrypted=True)410 assert disk.is_encrypted is True411 def test_lv_is_not_encrypted_lvm_api(self, factory, device_info):412 lsblk = {'FSTYPE': 'xfs', 'TYPE': 'lvm'}413 blkid = {'TYPE': 'mapper'}414 device_info(lsblk=lsblk, blkid=blkid)415 disk = device.Device("/dev/sda")416 disk.lv_api = factory(encrypted=False)417 assert disk.is_encrypted is False418class TestDeviceOrdering(object):419 def setup(self):420 self.data = {421 "/dev/sda": {"removable": 0},422 "/dev/sdb": {"removable": 1}, # invalid423 "/dev/sdc": {"removable": 0},424 "/dev/sdd": {"removable": 1}, # invalid425 }426 def test_valid_before_invalid(self, device_info):427 lsblk = {"TYPE": "disk"}428 device_info(devices=self.data,lsblk=lsblk)429 sda = device.Device("/dev/sda")430 sdb = device.Device("/dev/sdb")431 assert sda < sdb432 assert sdb > sda433 def test_valid_alphabetical_ordering(self, device_info):434 lsblk = {"TYPE": "disk"}435 device_info(devices=self.data,lsblk=lsblk)436 sda = device.Device("/dev/sda")437 sdc = device.Device("/dev/sdc")438 assert sda < sdc439 assert sdc > sda440 def test_invalid_alphabetical_ordering(self, device_info):441 lsblk = {"TYPE": "disk"}442 device_info(devices=self.data,lsblk=lsblk)443 sdb = device.Device("/dev/sdb")444 sdd = device.Device("/dev/sdd")445 assert sdb < sdd446 assert sdd > sdb447class TestCephDiskDevice(object):448 def test_partlabel_lsblk(self, device_info):449 lsblk = {"TYPE": "disk", "PARTLABEL": ""}450 device_info(lsblk=lsblk)451 disk = device.CephDiskDevice(device.Device("/dev/sda"))452 assert disk.partlabel == ''453 def test_partlabel_blkid(self, device_info):454 blkid = {"TYPE": "disk", "PARTLABEL": "ceph data"}455 device_info(blkid=blkid)456 disk = device.CephDiskDevice(device.Device("/dev/sda"))457 assert disk.partlabel == 'ceph data'458 @pytest.mark.usefixtures("blkid_ceph_disk_member",459 "disable_kernel_queries")460 def test_is_member_blkid(self, monkeypatch, patch_bluestore_label):461 disk = device.CephDiskDevice(device.Device("/dev/sda"))462 assert disk.is_member is True463 @pytest.mark.usefixtures("lsblk_ceph_disk_member",464 "disable_kernel_queries")465 def test_is_member_lsblk(self, patch_bluestore_label, device_info):466 lsblk = {"TYPE": "disk", "PARTLABEL": "ceph"}467 device_info(lsblk=lsblk)468 disk = device.CephDiskDevice(device.Device("/dev/sda"))469 assert disk.is_member is True470 def test_unknown_type(self, device_info):471 lsblk = {"TYPE": "disk", "PARTLABEL": "gluster"}472 device_info(lsblk=lsblk)473 disk = device.CephDiskDevice(device.Device("/dev/sda"))474 assert disk.type == 'unknown'475 ceph_types = ['data', 'wal', 'db', 'lockbox', 'journal', 'block']476 @pytest.mark.usefixtures("blkid_ceph_disk_member",477 "disable_kernel_queries")478 def test_type_blkid(self, monkeypatch, device_info, ceph_partlabel):479 disk = device.CephDiskDevice(device.Device("/dev/sda"))480 assert disk.type in self.ceph_types481 @pytest.mark.usefixtures("blkid_ceph_disk_member",482 "lsblk_ceph_disk_member",483 "disable_kernel_queries")484 def test_type_lsblk(self, device_info, ceph_partlabel):485 disk = device.CephDiskDevice(device.Device("/dev/sda"))486 assert disk.type in self.ceph_types
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!!