How to use ceilometer method in tempest

Best Python code snippet using tempest_python

ceilometer_tests.py

Source:ceilometer_tests.py Github

copy

Full Screen

1# vim: tabstop=4 shiftwidth=4 softtabstop=42# Copyright 2012 Canonical Ltd.3#4# Licensed under the Apache License, Version 2.0 (the "License"); you may5# not use this file except in compliance with the License. You may obtain6# a copy of the License at7#8# http://www.apache.org/licenses/LICENSE-2.09#10# Unless required by applicable law or agreed to in writing, software11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the13# License for the specific language governing permissions and limitations14# under the License.15from django import http16from mox import IsA # noqa17from openstack_dashboard import api18from openstack_dashboard.test import helpers as test19class CeilometerApiTests(test.APITestCase):20 def test_sample_list(self):21 samples = self.samples.list()22 meter_name = "meter_name"23 ceilometerclient = self.stub_ceilometerclient()24 ceilometerclient.samples = self.mox.CreateMockAnything()25 ceilometerclient.samples.list(meter_name=meter_name, q=[]).\26 AndReturn(samples)27 self.mox.ReplayAll()28 ret_list = api.ceilometer.sample_list(self.request,29 meter_name,30 query=[])31 for c in ret_list:32 self.assertIsInstance(c, api.ceilometer.Sample)33 def test_meter_list(self):34 meters = self.meters.list()35 ceilometerclient = self.stub_ceilometerclient()36 ceilometerclient.meters = self.mox.CreateMockAnything()37 ceilometerclient.meters.list([]).AndReturn(meters)38 self.mox.ReplayAll()39 ret_list = api.ceilometer.meter_list(self.request, [])40 for m in ret_list:41 self.assertIsInstance(m, api.ceilometer.Meter)42 def test_resource_list(self):43 resources = self.resources.list()44 ceilometerclient = self.stub_ceilometerclient()45 ceilometerclient.resources = self.mox.CreateMockAnything()46 ceilometerclient.resources.list(q=[]).AndReturn(resources)47 self.mox.ReplayAll()48 ret_list = api.ceilometer.resource_list(self.request, query=[])49 for r in ret_list:50 self.assertIsInstance(r, api.ceilometer.Resource)51 def test_statistic_list(self):52 statistics = self.statistics.list()53 meter_name = "meter_name"54 ceilometerclient = self.stub_ceilometerclient()55 ceilometerclient.statistics = self.mox.CreateMockAnything()56 ceilometerclient.statistics.list(meter_name=meter_name,57 period=None, q=[]).\58 AndReturn(statistics)59 self.mox.ReplayAll()60 ret_list = api.ceilometer.statistic_list(self.request,61 meter_name,62 period=None,63 query=[])64 for s in ret_list:65 self.assertIsInstance(s, api.ceilometer.Statistic)66 #TODO(lsmola)67 #test resource aggregates68 @test.create_stubs({api.ceilometer.CeilometerUsage: ("get_user",69 "get_tenant")})70 def test_global_data_get(self):71 class TempUsage(api.base.APIResourceWrapper):72 _attrs = ["id", "tenant", "user", "resource", "fake_meter_1",73 "fake_meter_2"]74 meters = ["fake_meter_1",75 "fake_meter_2"]76 default_query = ["Fake query"]77 stats_attr = "max"78 resources = self.resources.list()79 statistics = self.statistics.list()80 user = self.ceilometer_users.list()[0]81 tenant = self.ceilometer_tenants.list()[0]82 ceilometerclient = self.stub_ceilometerclient()83 ceilometerclient.resources = self.mox.CreateMockAnything()84 # I am returning only 1 resource85 ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources[:1])86 ceilometerclient.statistics = self.mox.CreateMockAnything()87 # check that list is called twice for one resource and 2 meters88 ceilometerclient.statistics.list(meter_name=IsA(str),89 period=None, q=IsA(list)).\90 AndReturn(statistics)91 ceilometerclient.statistics.list(meter_name=IsA(str),92 period=None, q=IsA(list)).\93 AndReturn(statistics)94 api.ceilometer.CeilometerUsage\95 .get_user(IsA(str)).AndReturn(user)96 api.ceilometer.CeilometerUsage\97 .get_tenant(IsA(str)).AndReturn(tenant)98 self.mox.ReplayAll()99 # getting all resources and with statistics100 ceilometer_usage = api.ceilometer.CeilometerUsage(http.HttpRequest)101 data = ceilometer_usage.global_data_get(102 used_cls=TempUsage, query=["fake_query"], with_statistics=True)103 first = data[0]104 self.assertEqual(first.id, 'fake_project_id__fake_user_id__'105 'fake_resource_id')106 self.assertEqual(first.user.name, 'user')107 self.assertEqual(first.tenant.name, 'test_tenant')108 self.assertEqual(first.resource, 'fake_resource_id')109 self.assertEqual(first.fake_meter_1, 9)110 self.assertEqual(first.fake_meter_2, 9)111 # check that only one resource is returned112 self.assertEqual(len(data), 1)113 @test.create_stubs({api.ceilometer.CeilometerUsage: ("get_user",114 "get_tenant")})115 def test_global_data_get_without_statistic_data(self):116 class TempUsage(api.base.APIResourceWrapper):117 _attrs = ["id", "tenant", "user", "resource", "fake_meter_1",118 "fake_meter_2"]119 meters = ["fake_meter_1",120 "fake_meter_2"]121 default_query = ["Fake query"]122 stats_attr = "max"123 resources = self.resources.list()124 user = self.ceilometer_users.list()[0]125 tenant = self.ceilometer_tenants.list()[0]126 ceilometerclient = self.stub_ceilometerclient()127 ceilometerclient.resources = self.mox.CreateMockAnything()128 ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources)129 api.ceilometer.CeilometerUsage\130 .get_user(IsA(str)).MultipleTimes().AndReturn(user)131 api.ceilometer.CeilometerUsage\132 .get_tenant(IsA(str)).MultipleTimes().AndReturn(tenant)133 self.mox.ReplayAll()134 # getting all resources and with statistics135 ceilometer_usage = api.ceilometer.CeilometerUsage(http.HttpRequest)136 data = ceilometer_usage.global_data_get(137 used_cls=TempUsage, query=["fake_query"], with_statistics=False)138 first = data[0]139 self.assertEqual(first.id, 'fake_project_id__fake_user_id__'140 'fake_resource_id')141 self.assertEqual(first.user.name, 'user')142 self.assertEqual(first.tenant.name, 'test_tenant')143 self.assertEqual(first.resource, 'fake_resource_id')144 self.assertRaises(AttributeError, getattr, first, 'fake_meter_1')145 self.assertRaises(AttributeError, getattr, first, 'fake_meter_2')146 self.assertEqual(len(data), len(resources))147 @test.create_stubs({api.ceilometer.CeilometerUsage: ("get_user",148 "get_tenant")})149 def test_global_data_get_all_statistic_data(self):150 class TempUsage(api.base.APIResourceWrapper):151 _attrs = ["id", "tenant", "user", "resource", "fake_meter_1",152 "fake_meter_2"]153 meters = ["fake_meter_1",154 "fake_meter_2"]155 default_query = ["Fake query"]156 stats_attr = None # have to return dictionary with all stats157 resources = self.resources.list()158 statistics = self.statistics.list()159 user = self.ceilometer_users.list()[0]160 tenant = self.ceilometer_tenants.list()[0]161 ceilometerclient = self.stub_ceilometerclient()162 ceilometerclient.resources = self.mox.CreateMockAnything()163 ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources)164 ceilometerclient.statistics = self.mox.CreateMockAnything()165 ceilometerclient.statistics.list(meter_name=IsA(str),166 period=None, q=IsA(list)).\167 MultipleTimes().\168 AndReturn(statistics)169 api.ceilometer.CeilometerUsage\170 .get_user(IsA(str)).MultipleTimes().AndReturn(user)171 api.ceilometer.CeilometerUsage\172 .get_tenant(IsA(str)).MultipleTimes().AndReturn(tenant)173 self.mox.ReplayAll()174 # getting all resources and with statistics175 ceilometer_usage = api.ceilometer.CeilometerUsage(http.HttpRequest)176 data = ceilometer_usage.global_data_get(177 used_cls=TempUsage, query=["fake_query"], with_statistics=True)178 first = data[0]179 self.assertEqual(first.id, 'fake_project_id__fake_user_id__'180 'fake_resource_id')181 self.assertEqual(first.user.name, 'user')182 self.assertEqual(first.tenant.name, 'test_tenant')183 self.assertEqual(first.resource, 'fake_resource_id')184 statistic_obj = api.ceilometer.Statistic(statistics[0])185 # check that it returns whole statistic object186 self.assertEqual(vars(first.fake_meter_1[0]), vars(statistic_obj))187 self.assertEqual(vars(first.fake_meter_2[0]), vars(statistic_obj))188 self.assertEqual(len(data), len(resources))189 @test.create_stubs({api.ceilometer.CeilometerUsage: ("get_user",190 "get_tenant")})191 def test_global_disk_usage(self):192 resources = self.resources.list()193 statistics = self.statistics.list()194 user = self.ceilometer_users.list()[0]195 tenant = self.ceilometer_tenants.list()[0]196 ceilometerclient = self.stub_ceilometerclient()197 ceilometerclient.resources = self.mox.CreateMockAnything()198 ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources)199 ceilometerclient.statistics = self.mox.CreateMockAnything()200 ceilometerclient.statistics.list(meter_name=IsA(str),201 period=None, q=IsA(list)).\202 MultipleTimes().\203 AndReturn(statistics)204 api.ceilometer.CeilometerUsage\205 .get_user(IsA(str)).MultipleTimes().AndReturn(user)206 api.ceilometer.CeilometerUsage\207 .get_tenant(IsA(str)).MultipleTimes().AndReturn(tenant)208 self.mox.ReplayAll()209 # getting all resources and with statistics210 ceilometer_usage = api.ceilometer.CeilometerUsage(http.HttpRequest)211 data = ceilometer_usage.global_disk_usage(query=["fake_query"],212 with_statistics=True)213 first = data[0]214 self.assertEqual(first.id, 'fake_project_id__fake_user_id__'215 'fake_resource_id')216 self.assertEqual(first.user.name, 'user')217 self.assertEqual(first.tenant.name, 'test_tenant')218 self.assertEqual(first.resource, 'fake_resource_id')219 self.assertEqual(first.disk_read_bytes, 4.55)220 self.assertEqual(first.disk_write_bytes, 4.55)221 self.assertEqual(first.disk_read_requests, 4.55)222 self.assertEqual(first.disk_write_requests, 4.55)223 self.assertEqual(len(data), len(resources))224 @test.create_stubs({api.ceilometer.CeilometerUsage: ("get_user",225 "get_tenant")})226 def test_global_network_traffic_usage(self):227 resources = self.resources.list()228 statistics = self.statistics.list()229 user = self.ceilometer_users.list()[0]230 tenant = self.ceilometer_tenants.list()[0]231 ceilometerclient = self.stub_ceilometerclient()232 ceilometerclient.resources = self.mox.CreateMockAnything()233 ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources)234 ceilometerclient.statistics = self.mox.CreateMockAnything()235 ceilometerclient.statistics.list(meter_name=IsA(str),236 period=None, q=IsA(list)).\237 MultipleTimes().\238 AndReturn(statistics)239 api.ceilometer.CeilometerUsage\240 .get_user(IsA(str)).MultipleTimes().AndReturn(user)241 api.ceilometer.CeilometerUsage\242 .get_tenant(IsA(str)).MultipleTimes().AndReturn(tenant)243 self.mox.ReplayAll()244 # getting all resources and with statistics245 ceilometer_usage = api.ceilometer.CeilometerUsage(http.HttpRequest)246 data = ceilometer_usage.global_network_traffic_usage(247 query=["fake_query"],248 with_statistics=True)249 first = data[0]250 self.assertEqual(first.id, 'fake_project_id__fake_user_id__'251 'fake_resource_id')252 self.assertEqual(first.user.name, 'user')253 self.assertEqual(first.tenant.name, 'test_tenant')254 self.assertEqual(first.resource, 'fake_resource_id')255 self.assertEqual(first.network_incoming_bytes, 4.55)256 self.assertEqual(first.network_incoming_packets, 4.55)257 self.assertEqual(first.network_outgoing_bytes, 4.55)258 self.assertEqual(first.network_outgoing_packets, 4.55)259 self.assertEqual(len(data), len(resources))260 self.assertIsInstance(first, api.ceilometer.GlobalNetworkTrafficUsage)261 @test.create_stubs({api.ceilometer.CeilometerUsage: ("get_user",262 "get_tenant")})263 def test_global_network_usage(self):264 resources = self.resources.list()265 statistics = self.statistics.list()266 user = self.ceilometer_users.list()[0]267 tenant = self.ceilometer_tenants.list()[0]268 ceilometerclient = self.stub_ceilometerclient()269 ceilometerclient.resources = self.mox.CreateMockAnything()270 ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources)271 ceilometerclient.statistics = self.mox.CreateMockAnything()272 ceilometerclient.statistics.list(meter_name=IsA(str),273 period=None, q=IsA(list)).\274 MultipleTimes().\275 AndReturn(statistics)276 api.ceilometer.CeilometerUsage\277 .get_user(IsA(str)).MultipleTimes().AndReturn(user)278 api.ceilometer.CeilometerUsage\279 .get_tenant(IsA(str)).MultipleTimes().AndReturn(tenant)280 self.mox.ReplayAll()281 # getting all resources and with statistics282 ceilometer_usage = api.ceilometer.CeilometerUsage(http.HttpRequest)283 data = ceilometer_usage.global_network_usage(284 query=["fake_query"],285 with_statistics=True)286 first = data[0]287 self.assertEqual(first.id, 'fake_project_id__fake_user_id__'288 'fake_resource_id')289 self.assertEqual(first.user.name, 'user')290 self.assertEqual(first.tenant.name, 'test_tenant')291 self.assertEqual(first.resource, 'fake_resource_id')292 self.assertEqual(first.network, 9)293 self.assertEqual(first.network_create, 9)294 self.assertEqual(first.subnet, 9)295 self.assertEqual(first.subnet_create, 9)296 self.assertEqual(first.port, 9)297 self.assertEqual(first.port_create, 9)298 self.assertEqual(first.router, 9)299 self.assertEqual(first.router_create, 9)300 self.assertEqual(first.ip_floating, 9)301 self.assertEqual(first.ip_floating_create, 9)302 self.assertEqual(len(data), len(resources))303 self.assertIsInstance(first, api.ceilometer.GlobalNetworkUsage)304 @test.create_stubs({api.ceilometer.CeilometerUsage: ("get_user",305 "get_tenant")})306 def test_global_object_store_usage(self):307 resources = self.resources.list()308 statistics = self.statistics.list()309 user = self.ceilometer_users.list()[0]310 tenant = self.ceilometer_tenants.list()[0]311 ceilometerclient = self.stub_ceilometerclient()312 ceilometerclient.resources = self.mox.CreateMockAnything()313 ceilometerclient.resources.list(q=IsA(list)).AndReturn(resources)314 ceilometerclient.statistics = self.mox.CreateMockAnything()315 ceilometerclient.statistics.list(meter_name=IsA(str),316 period=None, q=IsA(list)).\317 MultipleTimes().\318 AndReturn(statistics)319 api.ceilometer.CeilometerUsage\320 .get_user(IsA(str)).MultipleTimes().AndReturn(user)321 api.ceilometer.CeilometerUsage\322 .get_tenant(IsA(str)).MultipleTimes().AndReturn(tenant)323 self.mox.ReplayAll()324 # getting all resources and with statistics325 ceilometer_usage = api.ceilometer.CeilometerUsage(http.HttpRequest)326 data = ceilometer_usage.global_object_store_usage(327 query=["fake_query"],328 with_statistics=True)329 first = data[0]330 self.assertEqual(first.id, 'fake_project_id__fake_user_id__'331 'fake_resource_id')332 self.assertEqual(first.user.name, 'user')333 self.assertEqual(first.tenant.name, 'test_tenant')334 self.assertEqual(first.resource, 'fake_resource_id')335 self.assertEqual(first.storage_objects, 4.55)336 self.assertEqual(first.storage_objects_size, 4.55)337 self.assertEqual(first.storage_objects_incoming_bytes, 4.55)338 self.assertEqual(first.storage_objects_outgoing_bytes, 4.55)339 self.assertEqual(len(data), len(resources))...

Full Screen

Full Screen

map-services

Source:map-services Github

copy

Full Screen

1#!/usr/bin/env python2# dib-lint: disable=indent3# Copyright 2012 Hewlett-Packard Development Company, L.P.4# Copyright 2014 Red Hat, Inc.5#6# Licensed under the Apache License, Version 2.0 (the "License"); you may7# not use this file except in compliance with the License. You may obtain8# a copy of the License at9#10# http://www.apache.org/licenses/LICENSE-2.011#12# Unless required by applicable law or agreed to in writing, software13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the15# License for the specific language governing permissions and limitations16# under the License.17from __future__ import print_function18import os19import sys20# Manually maintained for brevity; consider making this compiled from21# distromatch or other rich data sources.22# TripleO service name on the left, Fedora/RHEL on the right.23service_map = {24 'apache2': 'httpd',25 'ceilometer-api': 'openstack-ceilometer-api',26 'ceilometer-agent-central': 'openstack-ceilometer-central',27 'ceilometer-agent-compute': 'openstack-ceilometer-compute',28 'ceilometer-agent-notification': 'openstack-ceilometer-notification',29 'ceilometer-collector': 'openstack-ceilometer-collector',30 'cinder-api': 'openstack-cinder-api',31 'cinder-scheduler': 'openstack-cinder-scheduler',32 'cinder-volume': 'openstack-cinder-volume',33 'glance-api': 'openstack-glance-api',34 'glance-reg': 'openstack-glance-registry',35 'heat-api': 'openstack-heat-api',36 'heat-api-cfn': 'openstack-heat-api-cfn',37 'heat-api-cloudwatch': 'openstack-heat-api-cloudwatch',38 'heat-engine': 'openstack-heat-engine',39 'ironic-api': 'openstack-ironic-api',40 'ironic-conductor': 'openstack-ironic-conductor',41 'keystone': 'openstack-keystone',42 'libvirt-bin': 'libvirtd',43 'mysql': ['mysqld', 'mariadb'],44 'nova-conductor': 'openstack-nova-conductor',45 'nova-api': 'openstack-nova-api',46 'nova-cert': 'openstack-nova-cert',47 'nova-scheduler': 'openstack-nova-scheduler',48 'nova-consoleauth': 'openstack-nova-consoleauth',49 'nova-compute': 'openstack-nova-compute',50 'nova-novncproxy': 'openstack-nova-novncproxy',51 'openvswitch-switch': 'openvswitch',52 'rsync': 'rsyncd',53 'swift-proxy': 'openstack-swift-proxy',54 'swift-account': 'openstack-swift-account',55 'swift-account-auditor': 'openstack-swift-account-auditor',56 'swift-account-reaper': 'openstack-swift-account-reaper',57 'swift-account-replicator': 'openstack-swift-account-replicator',58 'swift-container': 'openstack-swift-container',59 'swift-container-auditor': 'openstack-swift-container-auditor',60 'swift-container-replicator': 'openstack-swift-container-replicator',61 'swift-container-updater': 'openstack-swift-container-updater',62 'swift-object': 'openstack-swift-object',63 'swift-object-auditor': 'openstack-swift-object-auditor',64 'swift-object-replicator': 'openstack-swift-object-replicator',65 'swift-object-updater': 'openstack-swift-object-updater',66 'tgt': 'tgtd',67}68print("WARNING: map-services has been deprecated. "69 "Please use the svc-map element.", file=sys.stderr)70for arg in sys.argv[1:]:71 # We need to support the service name being different when installing from72 # source vs. packages. So, if the requested service file already exists,73 # just use that.74 if os.path.exists('/lib/systemd/system/%s.service' % arg):75 print(arg)76 else:77 mapping = service_map.get(arg, arg)78 # Handle cases where a service may map to multiple names depending on79 # which specific distribution we're using.80 if isinstance(mapping, list):81 for name in mapping:82 if os.path.exists('/lib/systemd/system/%s.service' % name):83 print(name)84 break85 else:86 # We didn't find a match for any of the mappings.87 print(arg)88 else:89 print(mapping)...

Full Screen

Full Screen

Ceilometer.py

Source:Ceilometer.py Github

copy

Full Screen

1__author__ = 'pike'2from Openstack.Service.OpenstackService import *3from Openstack.Conf import OpenstackConf4from Utils.HttpUtil import OpenstackRestful5class Ceilometer(OpenstackService):6 def __init__(self):7 OpenstackService.__init__(self)8 self.restful = OpenstackRestful(self.tokenId)9 def getAllMeters(self):10 url = "%s/v2/meters" % OpenstackConf.CEILOMETER_URL11 result = self.restful.getResult(url)12 return result13 def getAllResources(self):14 url = "%s/v2/resources" % OpenstackConf.CEILOMETER_URL15 result = self.restful.getResult(url)16 return result17 def getMeter(self, meter_name, queryFilter):18 url = "%s/v2/meters/%s" % (OpenstackConf.CEILOMETER_URL, meter_name)19 #transfer str to list20 queryFilter = eval(queryFilter)21 print queryFilter22 params = ""23 for queryItem in queryFilter:24 param = ""25 for key in queryItem:26 param += "&q.%s=%s" % (key, queryItem[key])27 params += param28 url = url + "?" + params29 result = self.restful.getResult(url)30 return result[0]31 def getMeterStatistics(self, meter_name, queryFilter, groupby = None, period = None, aggregate = None):32 url = "%s/v2/meters/%s/statistics" % (OpenstackConf.CEILOMETER_URL, meter_name)33 #transfer str to list34 queryFilter = eval(queryFilter)35 #print queryFilter36 params = ""37 for queryItem in queryFilter:38 param = ""39 for key in queryItem:40 param += "&q.%s=%s" % (key, queryItem[key])41 params += param42 url = url + "?" + params43 print url44 result = self.restful.getResult(url)45 return result[0]46 #def getCpuStat(self, startTime, endTime, resourceId):47 #48 # #url = "%s/v2/meters/%s/statistics" % (OpenstackConf.CEILOMETER_URL, "cpu_util")49 # url = "%s/v2/meters/%s/statistics" % (OpenstackConf.CEILOMETER_URL, "compute.node.cpu.idle.time")50 #51 # #add params (use "Get" not "Post")52 # urlParam = "?&q.field=timestamp&q.op=ge&q.value=%s" % startTime + \53 # "&q.field=timestamp&q.op=lt&q.value=%s" % endTime + \54 # "&q.field=resource_id&q.op=eq&q.value=%s" % "compute1_compute1"55 # url += urlParam56 #57 # result = self.restful.getResult(url)58 # return result[0]59 #60 #def getAvgCpuFromStat(self, cpuStat):61 # return cpuStat["avg"]62if __name__=="__main__":63 ceilometerTest = Ceilometer()64 q = '''[{"field": "timestamp",65 "op": "ge",66 "value": "2014-12-12T00:00:00"},67 {"field": "timestamp",68 "op": "lt",69 "value": "2014-12-16T00:00:00"},70 {"field": "resource_id",71 "op": "eq",72 "value": "feebf6dc-2f04-4e1d-977e-6c7fde4e4cb3"}]'''73 print ceilometerTest.getMeterStatistics("cpu_util", q)74 #print ceilometerTest.getCpuStat("2014-12-12T00:00:00", "2014-12-16T00:00:00", "feebf6dc-2f04-4e1d-977e-6c7fde4e4cb3")...

Full Screen

Full Screen

Automation Testing Tutorials

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.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run tempest automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful