自动化测试框架文件管理思路
setUpClass、tearDownClass要调用同一个属性,需要加cls.
若其他方法func也要调用该属性,则加self.
class LoginTest(unittest2.TestCase):
def test_login(self):
self.driver.get('') # 调用公共属性
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome('C:\Program Files\Google\Chrome\Application\chromedriver') # 创建公共属性
@classmethod
def tearDownClass(cls):
cls.driver.quit() # 调用公共属性
登录方法
- 代码
import time
import unittest2
from selenium import webdriver
class LoginTest(unittest2.TestCase):
def test_login(self):
self.driver.get('http://localhost/index.php?m=user&c=public&a=login') # 调用公共属性
self.driver.find_element_by_id('username').send_keys('zhengzhouxiao')
self.driver.find_element_by_id('password').send_keys('123123123')
self.driver.find_element_by_css_selector('.login_btn.fl').click()
@classmethod
def setUpClass(cls):
# cls.driver = webdriver.Chrome('C:\Program Files\Google\Chrome\Application\chromedriver')
cls.driver = webdriver.Chrome() # 创建公共属性
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
@classmethod
def tearDownClass(cls):
time.sleep(10)
cls.driver.quit() # 调用公共属性
if __name__ == '__main__':
unittest2.main()
BaseTestCase
创建一个父类,实现setUpClass和tearDownClass方法,以后的测试用例继承这个父类,继承父类,就继承了父类的所有方法,不需要重复写方法
- 代码
import unittest2
from selenium import webdriver
import time
class BaseTestCase(unittest2.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.implicitly_wait(5)
@classmethod
def tearDownClass(cls):
time.sleep(10)
cls.driver.quit()
- 注册方法 代码
import unittest2
from test_case.BestTestCase import BaseTestCase
class RegisterTest(BaseTestCase):
def test_register(self):
self.driver.get('http://localhost/index.php?m=user&c=public&a=reg')
self.driver.find_element_by_name('username').send_keys('new_user')
self.driver.find_element_by_name('password').send_keys('password')
self.driver.find_element_by_name('userpassword2').send_keys('password')
self.driver.find_element_by_name('mobile_phone').send_keys('13412312311')
self.driver.find_element_by_name('email').send_keys("123123123@qq.com")
self.driver.find_element_by_class_name('reg_btn').click()
数据驱动测试
如批量注册10个用户
步骤:
1、准备一个excel表格,保存好10个用户信息
2、编写代码读取excel表中的内容
- 步骤&代码
# 1、导入代码库
import csv
# 2、指定csv文件所在路径
# 当路径中存在反斜线时,需要在字符串前面加一个字母r,用来表示不再把反斜线/看成转译字符
path=r'C:\Users\admin\PycharmProjects\study1.0\test_data\esigter_test_data.csv'
# 3、打开csv文件
with open(path) as tile
# 4、读取csv文件中的内容
table = csv.reader(file)
# 5、打印csv文件的内容
for row in table:
print(row)
- 封装成一个方法并返回值被调用
import csv
def reader(filename):
path = '../test_data/'+filename
#..表示当前路径的上层路径,将反斜杆\换成斜杆/则不用r放置前面
file = open(path)
table = csv.reader(file)
return table
- 去掉表格第1行字段名方法
import csv
def reader(filename):
list = []
# path = '../test_data/'+filename
path = r"C:\Users\admin\PycharmProjects\study1.0\test_data\\" + filename
with open(path) as file:
table = csv.reader(file)
i = 0
for row in table:
if i == 0:
pass
else:
list.append(row)
i = i+1
return list
3、把读取到的内容分别传入测试用例中,循环执行10次
- 运行方法代码
from func.csvfileManager2 import reader
from test_case.BaseTestCase import BaseTestCase
class Register2Test(BaseTestCase):
def test_register(self):
table = reader('resigter_test_data.csv')
for row in table:
self.driver.get('http://localhost/index.php?m=user&c=public&a=reg')
self.driver.find_element_by_name('username').send_keys(row[0])
self.driver.find_element_by_name('password').send_keys(row[1])
self.driver.find_element_by_name('userpassword2').send_keys(row[2])
self.driver.find_element_by_name('mobile_phone').send_keys(row[3])
self.driver.find_element_by_name('email').send_keys(row[4])
self.driver.find_element_by_class_name('reg_btn').click()
- 实际运行中遇到的问题
实际运行时老提示找不到该文件 ,将func.csvfileManager2中的path相对路径换成绝对路径(注意转义符转化)成功
- 代码
import csv
def reader(filename):
# path = '../test_data/'+filename # 不成功
# path = "C:\\Users\\admin\\PycharmProjects\\study1.0\\test_data\\" + filename
# 成功
path = r"C:\Users\admin\PycharmProjects\study1.0\test_data\\" + filename
# 成功,注意最后的\要写成\\,否则后面的变量不准确
print(path)
file = open(path)
table = csv.reader(file)
return table
reader('resigter_test_data.csv')
问题:用for循环,当其中任何一条测试用例执行失败,后续测试数据将不被执行
解决:
1、导入代码库 ddt (data driver test),即数据驱动测试
2、调用读取csv文件的方法
3、把每一行数据看成一个单独的测试用例来执行
在类的上面加装饰器 @ddt.ddt 表示当前类是一个数据驱动测试的类;
在方法上面加装饰器 @ddt.data() 用来指定测试数据源,要求数据源的格式不能是数组或是列表,得是多个参数:
列表前面加*表示把列表内的数据转化为对应数量的变量
- 参考代码
import ddt
import unittest2
from func.csvfileManager2 import reader
from test_case.BaseTestCase import BaseTestCase
@ddt.ddt
class Register3Test(BaseTestCase):
table = reader('resigter_test_data.csv')
# table是一个列表,前面加*表示把列表内的数据转化为对应数量的变量
@ddt.data(*table)
def test_register(self,row):
self.driver.get('http://localhost/index.php?m=user&c=public&a=reg')
self.driver.find_element_by_name('username').send_keys(row[0])
self.driver.find_element_by_name('password').send_keys(row[1])
self.driver.find_element_by_name('userpassword2').send_keys(row[2])
self.driver.find_element_by_name('mobile_phone').send_keys(row[3])
self.driver.find_element_by_name('email').send_keys(row[4])
self.driver.find_element_by_class_name('reg_btn').click()
if __name__ == '__main__':
unittest2.main()
批量执行测试用例