三、用Selenium做自动化测试的项目
1.Selenium自动化测试基本流程:
(1)熟悉需求
(2)制定测试计划
(3)设计测试用例
(4)搭建测试环境
(5)编写测试代码
(6)评审测试代码
(7)用于做回归测试
(8)每个版本测试完毕都需要做测试总结报告
2.假设:ECShop后台登录模块分配给你来测试,用例和数据可以从百度网盘Selenium资料
用例_ECShop_后台登录.xlsx
数据_ECShop_后台登录.csv
3.思考:怎么管理测试代码?怎么划分包?每个包里放什么内容?在seleniumproject1的工程下新建ecshopv1包,在包里新建一些子包
(1)data包:放测试数据的csv格式文件,用例也可以放在这个包里来统一管理。
(2)util包:放工具型测试代码文件,例如read_csv.py
(3)case包:放用例的实现代码文件,例如后台登录模块对应的测试用例代码文件
4.问题:各个模块的测试用例类都需要实现setUp、tearDown、is_alert_present、is_element_present等等一些通用的函数,除了这些通用函数以外,
主要要实现的就是各个模块不同业务步骤的测试函数,为了让代码不冗余,可以考虑把测试函数以外的跟业务没有关系的通用函数从测试类里提取出来,做成统一
的被调用模块,如何提取?
分析:想把通用函数放入到测试类的父类里,但是当前测试类的父类是unittest模块自带的TestCase类,初学者建议不要修改。
解决方案:使用多重继承的思想(A---B---C)来实现,将各个模块的测试类父类修改为自定义中间层类(假设叫做MyBase类),然后再让MyBase类的父类定
义为unittest.TestCase类,这样就可以把要提取出来的通用函数放在MyBase类里,这样各个模块的测试类即可以使用父类MyBase里的setUp等通用函数,
也可以使用unittest.TestCase类里提供的断言方法。
class MyTestCase1(unittest.TestCase):
def setUp(self)
def test_something(self):
xxxxx
class MyTestCase2(unittest.TestCase):
def setUp(self)
def test_something(self):
yyyyy
5.新建子包base,在该子包里新建mybase的文件,该文件里新建类MyBase,实现了通用的函数,继承了unittest.TestCase类。这个类可以自己扩展,加入更多的通用的函数。
注意:测试函数不要加入到MyBase类里,需要写MyBase类的某一个子类里。
示例:
import unittest
from selenium import webdriver
from selenium.common.exceptions import NoAlertPresentException,NoSuchElementException
class MyBase(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(15)
def tearDown(self):
self.driver.quit()
def is_alert_present(self):
try:
self.driver.switch_to.alert
except NoAlertPresentException:
return False
return True
def is_element_present(self,how,what):
try:
self.driver.find_element(how,what)
except NoSuchElementException:
return False
return True
6.case子包里的后台登录代码文件里类默认名称是MyTestCase,类名建议修改为能见名知意的类名,比如BgLoginTestCase,把这个类的父类从
unittest.TestCase修改为新导入的MyBase类。
class BgLoginTestCase(unittest.TestCase):
修改为:
from ecshopv1.base.mybase import MyBase
class BgLoginTestCase(MyBase):
7.说明:虽然有6种类型的检查需要做,但是我们设计了一个预期结果编号的数据,随着操作时要输入到被测系统里的数据一起,通过read_csv模块里工具
读取到测试用例类里,这样就可以只准备一个测试数据文件,只写一个测试函数了,不用拆分成多个数据文件,并导入给不同的测试函数使用了。在唯一的测试
函数中判断预期结果编号等于不同值时做不同的检查。
8.读取csv文件里的测试数据:因为data子包在ecshopv1包下,所以相对路径写法用..找到当前case子包的上一级包ecshopv1包,然后再向下找到data子包,
最后找到csv文件。
示例:
from ecshopv1.util.read_csv import CSVUtil
filepath="../data/数据_ECShop_后台登录.csv"
u=CSVUtil(filepath)
d=u.list_data()
print(d)
9.使用ddt装饰器来将这些数据传入到test_login的测试函数中。
注意:测试函数的形参变量个数必须与csv文件里每行数据值个数一致。
示例:
@ddt
class BgLoginTestCase(MyBase):
@data(*d1)
@unpack
def test_login(self,a,b,c,d,e,f):#数据编号 用例编号 用户名 密码 验证码 预期结果编号
print(a,b,c,d,e,f)
10.测试函数的函数体里打开后台页,输入三个文本框内容,点击“进入管理中心”按钮,判断预期结果编号的值等于几,根据值的不同,来做不同的检查。