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_typesLearn 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!!
