一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于软件测试中的“测试程序的异常优化及Retry优化”。
1.异常优化
考虑以下情形。
def testLogin(){
#从Excel文件中读入测试数据,比如:Jerry/123456
#继续后续测试
}
def teardown(){
#从数据库表中删除的读入的数据,比如:Jerry/123456
...
}
比如测试程序在继续后续测试的时候出现了一个异常,比如元素没有找到,系统会自动退出,而不去执行teardown方法,也就是说数据库中的数据没有得到清除,这样如果下一次测试同样的case,采用同样的测试数据就会使测试程序发生脏数据异常,为了解决这个问题,可以通过使用Python的try- except来捕获异常,并且将所有的方法封装在一个类中。在util.py中封装一个class类。
(1)封装定位API
案例4-75:封装定位API。
def find_element_by_id(self,driver,mystr):
try:
return driver.find_element_by_id(mystr)
except NoSuchElementException:
print("find_element_by_id 没有发现元素"+mystr)
这样如果系统通过by_id方式找不到某个元素,测试程序会抛出“find_element_by_id 没有发现元素"+mystr(mystr即定位的id号)”信息,然后继续下面的程序。调用的时候采用下面的方法。
def setUp(self):
d = drivers()
self.driver=d.driver
self.fd=findby()
self.fd.implicitly_wait(self.driver,5)
…
def test_XXX():
self.fd.find_element_by_id(self.driver,"kw").clear()
其他的定位方式也采取同样的做法。
(2)封装操作API
案例4-76:封装操作API。
def send_keys(self,elenment,send_string):
try:
elenment.send_keys(send_string)
except:
print("send_keys操作失败")
当执行send_keys发生异常,系统抛出“send_keys操作失败”信息,然后继续下面的程序。调用的时候采用下面的方法。
self.fd.send_keys(self.fd.find_element_by_id(self.driver,"kw"),inputstring)
2.Retry优化
UI自动化测试程序的最大问题之一在于由于网络不稳定,从而造成页面元素不是不存在,而是还没有被调出来(虽然Selenium提供了显隐式等待,实际工程中会发现这两个方法是有缺陷的,并且好些浏览器根本就不支持)。在这里进行如下的优化。
案例4-77:Retry优化。
def find_element_by_id(self,driver,mystr):
try:
return driver.find_element_by_id(mystr)
except NoSuchElementException:
for i in range(2):
try:
time.sleep(2000)
return driver.find_element_by_id(mystr)
except NoSuchElementException:
print("尝试第"+str(i+1)+"次失败")
print("尝试第3次失败")
print("find_element_by_id 没有发现元素"+mystr)
当程序找不到元素的时候,等待2秒钟,继续获取,如果还是没有取到继续等待,在这里设置了3次的等待机会,如果没有报异常信息。