qq哟想python框架优化_3种⽅式优化Python⾃动化代码
⼀、开始
1.先把要做的事⼀步⼀步⽤注释写出来,然后再写代码。切记⼀定要写注释!不然回头看不懂⾃⼰写的是啥,这就尴尬了。
2.提⾼测试⽤例运⾏效率,减少测试⽤例运⾏时间:
Web⾃动化⽤例在编写的时候要注意⽤例的独⽴性。当然,流程性质的⽤例⼀定是关联在⼀起的,⽽且⽐较长⽐较复杂,上下⽤例之间是有关联的,那就必须关联起来。
⽬前,每个⽤例都有去打开浏览器,访问⽹址,然后登陆,tearDown()的时候关闭。
3.能不能在所有⽤例执⾏之前只打开⼀次浏览器,在所有⽤例执⾏之后,关闭浏览器呢?
可以,但是必须考虑中间某⼀个⽤例失败了是否会影响下⼀个⽤例的运⾏?必须考虑好这样情况发⽣后,任何其它⽤例都不会受到影响。
想做到所有⽤例执⾏之前只访问⽹页⼀次,所有⽤例执⾏完成以后只关闭⼀次,就必须符合以下条件:周公解梦梦见坟墓
幸福的像花儿一样实际上,每个测试⽤例的起点都是在登陆页⾯。
1.保证所有⽤例在运⾏的时候,起点是在登陆页⾯;
2.前提是当前尚未登陆成功的状态;
因为异常⽤例都是在登陆页⾯,没⽤登陆成功的,先执⾏异常⽤例再执⾏正常⽤例,就做到了所有⽤例都是尚未登陆的状态。
4.但是,你的⽤户名和密码已经有数据输⼊了,怎么才能不影响下⼀条⽤例的运⾏?
要做到第⼀次访问登陆页⾯⼀样的效果。
1.所有⽤例运⾏之前,打开浏览器,访问登陆页⾯;
2.每⼀个页⾯操作完成之后,操作当前页⾯;
3.最后⼀个⽤例是登陆成功的⽤例。
所有⽤例运⾏之前,打开浏览器,访问登陆页⾯。tUp()和tearDown()做不到,它设计的⽬的就是每⼀个⽤例都会去执⾏的。
tUpClass()是每⼀个测试类运⾏的⼀次tUp。这个测试类下⾯有好⼏个测试⽤例,但是⼀个测试类只运⾏⼀次。tUp代表测试⽤例之前运⾏的。⼀个测试类当中,所有测试⽤例运⾏之前,会先执⾏tUpClass(),执⾏完之后,再去执⾏测试⽤例。
也就是说,⾸先执⾏tUpClass⾥⾯的代码-test1-test2-test3-testN-所有⽤例执⾏完之后是tearDownClass,这个时候,测试⽤例变成了夹⼼饼⼲。
tearDown()是每个⽤例做完之后可以做的事情。
不是必須tUp()和tearDown()成对出现的。可以只⽤tearDown()不⽤tUp()。这个是需要谁就⽤谁。测试⽤例中有什么样的前置就⽤tUp(),如果没有就不⽤。tUpClass()和tearDownClass()也是⼀样的,需要哪个就⽤哪个,不需要就不⽤,都要⽤就都写。
水萝卜怎么凉拌是TestCa中同样的⼀个⽅法。点击O可看到源码。
需要控制执⾏顺序。
能实现这种⽅式有2个条件,⾸先必须考虑:1.每⼀个测试的失败,会不会影响其它⽤例的执⾏。2.如果你发现,⽆论如何这个问题都不好解决,或者说能解决很⿇烦,就没有必要来做这种模式。
⼤家可以考虑下能不能实现,实现是最好的,实现不了就按照最开始讲的tUp()和tearDown(),多写点冗余的,时间多浪费点没关系。毕竟⾃动化代码是晚上运⾏的,稳定性为⾸要条件。
邱学华虽然做到了3次分层,但是很多⽹上的框架,看到别⼈写的框架中会有⼀个有意思的地⽅,元素定位⽬前是直接放在函数当中的,包括错误信息的获取,元素定位,全部放在函数当中的。
这⾥有个不好的地⽅,和测试数据的提取的⽅式是⼀样的原因:1.元素定位未必只在⼀个函数中⽤⼀次,有些元素定位可能在多个函数中都要⽤得到。2.这个页⾯其实不复杂。未来实际⼯作中不可能只有登录功能,还有其它的功能。那这个页⾯是⽐较复杂的,元素定位在⼏⼗个是很正常的。
⼏⼗个元素定位,你确认都是分布在不同的函数当中吗?
想把它分离开来就是希望能够针对性地去修改。login_page⾥⾯有元素变了,或者有操作步骤变了,那我也不想在每个函数中找元素定位⽅式。
⼆、3种⽅式
第⼀种⽅式,做成类的属性
记得加注释
这样写,如果只是元素定位发⽣变化,都不需要看下⾯的函数。
这是第⼀种⽅式,这种⽅式的弊端是:现在很多元素定位是Xpath,未来做项⽬还会⽤到id、css。⽐如现在是xpath定位,万⼀哪天元素多了个id,将来哪天想优化下,可能会修改定位⽅式。
这个地⽅只写了表达式没写定位类型,对应到这⾥的⽅法就是find_element_by_xpath()。这⾥的函数名称是要跟元素定位表达式和定位类型保持完全⼀致的。 改的时候⽐较痛苦。
第⼆种⽅式,把元素定位类型和元素定位表达式全部都写在⼀起。
如果元素定位⽅式发⽣改变,下⾯的查找元素不受影响。改成什么类型,就⽤什么类型。find_element()⾃动会去⽤的。
看find_element()源码⾥有对各种⽅式的判断:
元素定位和元素操作互不影响。
第三种⽅式,把元素定位和函数的操作分开。
参考By的源码,这个类中只定义了数据,没有⽅法:
在PageLocators中,跟页⾯⼀⼀对应。
loc.后⾯接的都是元素定位表达式,看名字筛选就好了。 如果是继承lf.会有⼀些函数名称跟它有很⾼的重复度,lf.的时候,要点的东西波尔效应
就很多了。
选的东西有点多,也有些是内置的driver,也不记得每个元素定位是什么样的,就有点混乱。
locator是元素定位的总称。
单向调⽤。PageObjects调⽤了PageLocators。
TestCas调⽤了TestDatas和PageObjects。
写代码的时候特别注意不要出现双向调⽤。
三、代码
loginpage_locators.py
产业结构升级index_page.py
login_page.py
test_login.py
Common_Datas.py
login_datas.py
此代码未运⾏,代码未写完,未完待续~
代码截图:
四、总结代码优化了3点
1.数据分离-TestDatas
为什么要做数据分离?
1)多环境切换。
2)数据公⽤。
3)好维护。如果有多个环境,我可以统⼀修改。
如果有公共数据,我就准备⼀份就好啦。⽆论是模块级别的公共数据还是整个测试系统的公共数据,降低重复度,⽅便管理。
2.测试⽤例-引⽤ddt
降低了⽤例的重复度。
3.优化了执⾏效率:
tUpClass
tearDownClass
之前是每条⽤例都要打开页⾯,关闭页⾯。现在是执⾏全部⽤例前打开⼀次,执⾏全部⽤例后关闭。但是要保证每条⽤例间互不影响。
4.元素定位和函数分离:元素定位类型和表达式⽤元组来管理-PageLocators层。
五、问题总结
1.写⾃动化代码的顺序
先把页⾯封装起来,页⾯封装起来的时候必须依赖于测试⽤例的分析和业务功能的分析。实际过程中,不会先写⽤例,会先把页⾯封装。页⾯封装完成之后,再去写测试⽤例。成长的
都已经准备好了,⽤例⾥⾯直接调⽤就⾏了。
在页⾯封装的过程中,元素定位和页⾯功能是⼀起实现的。先把元素定位准备好,再去写页⾯功能。
如果哪些元素定位是当时没定位好的,再去补就好了。这种模式下,在哪个页⾯补都是可以的,不影响其它部分。没有的都可以在上⾯追加,每⼀块都是可以这样做的。都不影响已写好的部分,也不需⼤改。
2.注意
在不清楚页⾯封装的情况下,最好的⽅式是:把测试⽤例⽤注释的⽅式写出来(不需要写代码),然后再⼀步⼀步补上代码。
3.Python框架和Python⾃动化框架有什么区别?
都是框架,⽅向不同。Python框架包含unittest
Python⾃动化框架⽬的⾮常明确是做项⽬级别的⾃动化测试的。
4.做⾃动化要执⾏那么多异常⽤例吗?
先执⾏正常的⽤例,如果是⾮常简单的异常⽤例就写。看情况,时间上安排得过来再去写异常的⽤例。
5.三次错误密码,会有验证码,这块怎么处理?
绕过验证码,3次错误密码,再写个⽤例对密码重试。
3次错误密码这个做不做⾃动化,看情况。
6.短信验证码去数据库查。
7.回归⽤例要不要有异常⽤例,因⼈因公司因项⽬⽽异。最后有学习python的私信我了解。