ddt数据驱动,在做自动化测试的时候,很多时候是要用到ddt来传参数的
要做到代码与数据分离,就要用专门的文件来保存数据,不要把数据写进代码里,用excel表格来存登录要用到的数据,这里记录一下ddt数据驱动测试登录页面。
1.做个excel表记录用户名和密码
这里是用公司开发的系统来测试的,所以用户名和密码打码了,
建一个user.xlsx,写一下表头:username,pwd,如图,这边用了两组数据,真实测试的时候肯定不止两组数据
2.用openpyxl读写excel里的数据
这里建一个data.py的文件,用于读写excel
这边用的是openpyxl的库
首先安装openpyxl
pip install openpyxl
这边是要用字典的方式来记录这些用户名和密码,因为他们是一组组的数据
代码如下:
要用类和方法的方式,便于其他文件的调用
这里返回的listdata是字典的集合
import openpyxl
class Data():
def openData(self):
wk = openpyxl.load_workbook("user.xlsx")
sheet1 = wk['Sheet1']
listdata = []
for x in range(2, sheet1.max_row + 1):
dict1 = {}
for y in range(1, sheet1.max_column + 1):
value = sheet1.cell(x, y).value
dict1[sheet1.cell(1, y).value] = value
listdata.append(dict1)
return listdata
openpyxl读写excel就不多赘述,可以看文档学习一下
3.编写登录页面的unittest,加上截图和断言
我们一般登录,输入url,用户名和密码,点击登录按钮即可
如下图所示
def test_login(self):
self.driver = webdriver.Chrome()
self.driver.get("url") #url是要登陆的系统
self.driver.find_element_by_id('userName').send_keys('username')
self.driver.find_element_by_id('passWord').send_keys('password')
self.driver.find_element_by_xpath("/html/body/div/div/div/div[2]/div/form/div[4]/div/div/span/button").click()
time.sleep(1)
这里要换的只是用户名和密码的输入
这时候用到ddt这个数据驱动,就可以很好的把数据传入进去
导库
from ddt import ddt,data
使用ddt里的data模块来传入数据
@ddt #装饰类
class MyTestCase(unittest.TestCase):
@data(('user1','password1'),('user2','password2'))
def test_login(self,data):
这里用的是直接把数据写入到代码里了,没有做到数据和代码分离,所以就要使用我们刚刚建好的excel文档
import unittest
from selenium import webdriver
from ddt import ddt,data
from data import Data
import time
@ddt
class TestLogin(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
def tearDown(self) -> None:
self.driver.quit()
@data(*Data().openData())
def test_login(self,dic):
self.driver.get("url") #系统的url
self.driver.find_element_by_id('userName').send_keys(dic['username'])
self.driver.find_element_by_id('passWord').send_keys(dic['pwd'])
self.driver.find_element_by_xpath("/html/body/div/div/div/div[2]/div/form/div[4]/div/div/span/button").click()
time.sleep(1)
这里就引入了刚刚编写的Data里的方法openData,然后用字典值key的方法来取得要用的用户名和密码
因为我测试的系统是做了权限的,所以不同权限的用户名登录进去看到的页面不一样,所以我要截图下来看看是否满足
这里用到了save_screenshot方法,只需要传入图片路径就好
save_screenshot(self, filename)
我是存在桌面的,并用了用户名来区分
#截图
pic_path = ("C:\\Users\\xiaozhouzou\\Desktop\\"+dic['username']+".png")
self.driver.save_screenshot(pic_path)
加入断言,登录页面一般登录进入就进入了系统的首页面,所以URL会变化,这里可以用页面当前url来判断是否登录成功
注意:这时候需要等待时间
time.sleep(1)
我刚开始就遇到了这个坑,没有写等待时间,导致断言失败,页面当前url一直是登录的url
self.assertIn('welcome',self.driver.current_url)
testlogin.py的完整代码:
import unittest
from selenium import webdriver
from ddt import ddt,data
from data import Data
import time
@ddt
class TestLogin(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
def tearDown(self) -> None:
self.driver.quit()
@data(*Data().openData())
def test_login(self,dic):
self.driver.get("url") #这里没写url
self.driver.find_element_by_id('userName').send_keys(dic['username'])
self.driver.find_element_by_id('passWord').send_keys(dic['pwd'])
self.driver.find_element_by_xpath("/html/body/div/div/div/div[2]/div/form/div[4]/div/div/span/button").click()
time.sleep(3)
#截图
pic_path = ("C:\\Users\\xiaozhouzou\\Desktop\\"+dic['username']+".png")
self.driver.save_screenshot(pic_path)
self.assertIn('welcome',self.driver.current_url)
if __name__ == '__main__':
unittest.main()
然后运行
在桌面上可以看到两个登录完毕的截图
还可以用HTMLTestRunner来生成测试报告,之前的博客写过如何生成测试报告,这里就不写了。
以上,就是写的测试登录页面的代码,写的比较简单
要用selenium做自动化测试,肯定是要用框架来封装的