ddt完结数据驱动,pythonddt达成数量

By admin in 4858.com on 2019年5月2日

(一)   前言

Python+Selenium笔记(十二):数据驱动测试,pythonselenium

(一)   前言

通过使用数据驱动测试,落成对输入值和预期结果的参数化。(举个例子:输入数据和预期结果能够一向读取Excel文书档案的数码)

(二)   ddt

使用ddt施行多少驱动测试,ddt库能够将测试中的变量参数化。使用ddt的时候,在测试类上接纳@ddt装饰符,在测试方法上采纳@data装饰符。@data装饰符将参数作为测试数据,参数能够是单个值、列表、元组、字典。对于列表和元组,要求用@unpack装饰符把列表和元组解析成多个参数。

利用上面包车型大巴通令安装ddt库

pip install ddt

(三)   通过Excel获取数据

读取Excel文件,须要选取xlrd库。

安装xlrd的库

pip install xlrd

借使要往Excel表格写多少,要求动用xlwt库

pip install xlwt

(四)   示范中用到的excel文件

邮箱

手机

登陆名称

昵称

密码

确认密码

预期结果

[email protected]

1

bky_110

盘古

test>100

test>100

手机号码有误

[email protected]

18898989878

b

盘古

test>100

test>100

不合要求,至少2个字符,最多30个字符

4858.com 1

(五)   示例

 1 from selenium import webdriver
 2 from ddt import ddt,data,unpack
 3 import xlrd
 4 import unittest
 5 #读取excel文件的函数
 6 def get_data(file_name):
 7     rows = []
 8     #读取excel的数据
 9     book = xlrd.open_workbook(file_name)
10     #通过索引访问第一个sheet页
11     sheet = book.sheet_by_index(0)
12     #迭代读取excel第一个sheet页的数据,sheet.nrows指excel的行数
13     for r_idx in range(1, sheet.nrows):
14         #row_values读取第r_idx行的数据(0代表读取第1列及后面所有列的数据)
15         #读取数据的时候,我们一般说的第一行、第一列,索引都是0
16         #所以r_idx=1的时候,读取的其实是excel第二行的数据
17         rows.append(list(sheet.row_values(r_idx,0)))
18         #先将手机号删除并赋值给pthone,然后转换为字符串并添加回原来的位置
19         pthone = rows[r_idx - 1].pop(1)
20         rows[r_idx - 1].insert(1, str(int(pthone)))
21     return rows
22 @ddt
23 class RegisterNewUserDDT(unittest.TestCase):
24     @classmethod
25     def setUpClass(cls):
26         cls.driver = webdriver.Chrome()
27         cls.driver.implicitly_wait(20)
28         cls.driver.maximize_window()
29         cls.driver.get('https://www.cnblogs.com/')
30         login_area = cls.driver.find_element_by_css_selector('#login_area')
31         register = login_area.find_element_by_link_text('注册')
32         register.click()
33     #读取excel文件的数据作为参数
34     @data(*get_data('data/reTest.xlsx'))
35     @unpack
36     def test_register_new_user(self,email,phone,login_name,nickname,password,confirm_password,expected_result):
37         driver = self.driver
38         self.assertTrue('用户注册 - 博客园' == driver.title)
39         # 定位注册页面各个字段
40         user_email = driver.find_element_by_id('Email')
41         user_phone_country = driver.find_element_by_id('CountryCode')
42         user_phone = driver.find_element_by_id('PhoneNum')
43         user_login_name = driver.find_element_by_id('LoginName')
44         user_nickname = driver.find_element_by_id('DisplayName')
45         user_password = driver.find_element_by_id('Password')
46         user_confirm_password = driver.find_element_by_id('ConfirmPassword')
47         #清除各字段的值(如果有)
48         user_email.clear()
49         user_phone.clear()
50         user_login_name.clear()
51         user_nickname.clear()
52         user_password.clear()
53         user_confirm_password.clear()
54         #输入邮箱、手机号等信息
55         user_email.send_keys(email)
56         user_phone.send_keys(phone)
57         user_login_name.send_keys(login_name)
58         user_nickname.send_keys(nickname)
59         user_password.send_keys(password)
60         user_confirm_password.send_keys(confirm_password)
61         #判断提示是否正确(这边应该有办法可以获取当前是第几次执行,下面的写法太死板了)
62         if phone == '1':
63             phone_error = driver.find_element_by_id('PhoneNum-error')
64             self.assertTrue(phone_error.text == expected_result)
65         elif login_name == 'b':
66             loginName_error = driver.find_element_by_id('LoginName-error')
67             self.assertTrue(loginName_error.text == expected_result)
68 
69     @classmethod
70     def tearDownClass(cls):
71         cls.driver.quit()

 

(一) 前言
通过动用数据驱动测试,落成对输入值和预期结果的参数化。(举例:输入…

ddt完结数据驱动,pythonddt达成数量。ddt 是第1方模块,需安装, pip install ddt

python ddt达成多少驱动,pythonddt完成数据

ddt 是第一方模块,需安装, pip install ddt

DDT包蕴类的装饰器ddt和多个法子装饰器data(直接输入测试数据)

平日景况下,data中的数据遵照三个参数字传送递给测试用例,若是data中包蕴多少个数据,以元组,列表,字典等数据,必要活动在本子中对数码进行表明大概选取unpack分解数据。

@data(a,b)

那正是说a和b各运营3回用例

@data([a,d],[c,d])

如若未有@unpack,那么[a,b]真是2个参数字传送入用例运营

如果有@unpack,那么[a,b]被解释开,依照用例中的多个参数字传送递 

现实看上面包车型客车例子:

import unittest
from ddt import ddt,data,unpack

@ddt
class MyTesting(unittest.TestCase):
  def setUp(self):
    print('this is the setUp')
  @data([1,2,3])
  def test_1(self,value):
    print(value)

  @data([3,2,1],[5,3,2],[10,4,6])
  @unpack
  def test_minus(self,a,b,expected):
    actual = int(a) - int(b)
    expected = int(expected)
    self.assertEqual(actual, expected)

  @data([2,3],[4,5])
  def test_compare(self,a,b):
    self.assertEqual(a,b)

  def tearDown(self):
    print('this is tearDown')

if __name__ == '__main__':
  unittest.main(verbosity=2)

结果分析:

  1. test_1的测试结果是ok的, 因为 [1,2,3]
    作为1个全部传给value,全数value 打字与印刷的值是[1,2,3]

    test_1112__3 (main.MyTesting) … ok
    test_compare123 (main.MyTesting) … ERROR
    [1, 2, 3]

  2. test_minus的测试结果也是ok的,由于在@data(…)下加了@unpack,
    代表会把数量表达,得到叁组测试数据,分别为:

    1.[3,2,1]
    2.[5,3,2]
    3.[10,4,6]
    test_minus132__1 (main.MyTesting) … ok
    test_minus253__2 (main.MyTesting) … ok
    test_minus3104__6 (main.MyTesting) … ok

  3. test_compare的测试结果是fail的,由于并未有加@unpack,
    固然还是会被领会成二组测试数据,然则[2,3]用作1个总体被传给了a,
    因为b就从未有过值传入了,所以壹推行后报了  TypeError: test_compare() missing 1 required
    positional argument: ‘b’  这句错。

    test_compare123 (main.MyTesting) … ERROR
    test_compare245 (main.MyTesting) … ERROR

    this is the setUp
    ERROR: test_compare123 (main.MyTesting)

    this is tearDown

    Traceback (most recent call last):
    File “D:\python\lib\site-packages\ddt.py”, line 139, in wrapper
    return func(self, *args, **kwargs)
    TypeError: test_compare() missing 1 required positional argument: ‘b’

    ======================================================================

    ERROR: test_compare245 (main.MyTesting)

    Traceback (most recent call last):
    File “D:\python\lib\site-packages\ddt.py”, line 139, in wrapper
    return func(self, *args, **kwargs)
    TypeError: test_compare() missing 1 required positional argument: ‘b’

如上正是ddt 的读书计算,ddt
还有file_data(能够从json恐怕yaml中拿走测试数据)的驱动格局,下篇继续啦。

ddt兑现数据驱动,pythonddt实现数量 ddt
是第壹方模块,需安装, pip install ddt
DDT包涵类的装饰器ddt和四个主意装饰器data(直接输入测试…

由此采用数据驱动测试,完结对输入值和预期结果的参数化。(比如:输入数据和预期结果能够一贯读取Excel文书档案的数量)

DDT包蕴类的装饰器ddt和多少个章程装饰器data(直接输入测试数据)

(二)   ddt

一般来说状态下,data中的数据根据贰个参数字传送递给测试用例,借使data中蕴藏四个数据,以元组,列表,字典等数码,必要活动在剧本中对数码举行分解大概应用unpack分解数据。

选拔ddt施行多少驱动测试,ddt库能够将测试中的变量参数化。使用ddt的时候,在测试类上行使@ddt装饰符,在测试方法上行使@data装饰符。@data装饰符将参数作为测试数据,参数能够是单个值、列表、元组、字典。对于列表和元组,需求用@unpack装饰符把列表和元组解析成多少个参数。

@data(a,b)

接纳上边包车型客车吩咐安装ddt库

那么a和b各运转2回用例

pip install ddt

@data([a,d],[c,d])

(三)   通过Excel获取数据

只要未有@unpack,那么[a,b]就是2个参数字传送入用例运转

读取Excel文件,需求选取xlrd库。

如果有@unpack,那么[a,b]被解释开,根据用例中的五个参数传递 

安装xlrd的库

实际看下边包车型的士例子:

pip install xlrd

import unittest
from ddt import ddt,data,unpack

@ddt
class MyTesting(unittest.TestCase):
  def setUp(self):
    print('this is the setUp')
  @data([1,2,3])
  def test_1(self,value):
    print(value)

  @data([3,2,1],[5,3,2],[10,4,6])
  @unpack
  def test_minus(self,a,b,expected):
    actual = int(a) - int(b)
    expected = int(expected)
    self.assertEqual(actual, expected)

  @data([2,3],[4,5])
  def test_compare(self,a,b):
    self.assertEqual(a,b)

  def tearDown(self):
    print('this is tearDown')

if __name__ == '__main__':
  unittest.main(verbosity=2)

举个例子要往Excel表格写多少,须要运用xlwt库

4858.com,结果分析:

pip install xlwt

  1. test_一的测试结果是ok的, 因为 [1,2,3]
    作为3个完整传给value,全体value 打字与印刷的值是[1,2,3]

(四)   示范中用到的excel文件

test_1_1__1__2__3_ (__main__.MyTesting) ... ok
test_compare_1__2__3_ (__main__.MyTesting) ... ERROR
[1, 2, 3]

邮箱

手机

登陆名称

昵称

密码

确认密码

预期结果

test@outlook.com

1

bky_110

盘古

test>100

test>100

手机号码有误

test@outlook.com

18898989878

b

盘古

test>100

test>100

不合要求,至少2个字符,最多30个字符

  1. test_minus的测试结果也是ok的,由于在@data(…)下加了@unpack,
    代表会把数据他们说明,获得三组测试数据,分别为:

4858.com 2

1.[3,2,1]
2.[5,3,2]
3.[10,4,6]
test_minus_1__3__2__1_ (__main__.MyTesting) ... ok
test_minus_2__5__3__2_ (__main__.MyTesting) ... ok
test_minus_3__10__4__6_ (__main__.MyTesting) ... ok

(五)   示例

  1. test_compare的测试结果是fail的,由于尚未加@unpack,
    即便仍旧会被清楚成二组测试数据,不过[2,3]作为一个整机被传给了a,
    因为b就从未值传入了,所以一推行后报了  TypeError: test_compare() missing 1 required
    positional argument: ‘b’  这句错。
 1 from selenium import webdriver
 2 from ddt import ddt,data,unpack
 3 import xlrd
 4 import unittest
 5 #读取excel文件的函数
 6 def get_data(file_name):
 7     rows = []
 8     #读取excel的数据
 9     book = xlrd.open_workbook(file_name)
10     #通过索引访问第一个sheet页
11     sheet = book.sheet_by_index(0)
12     #迭代读取excel第一个sheet页的数据,sheet.nrows指excel的行数
13     for r_idx in range(1, sheet.nrows):
14         #row_values读取第r_idx行的数据(0代表读取第1列及后面所有列的数据)
15         #读取数据的时候,我们一般说的第一行、第一列,索引都是0
16         #所以r_idx=1的时候,读取的其实是excel第二行的数据
17         rows.append(list(sheet.row_values(r_idx,0)))
18         #先将手机号删除并赋值给pthone,然后转换为字符串并添加回原来的位置
19         pthone = rows[r_idx - 1].pop(1)
20         rows[r_idx - 1].insert(1, str(int(pthone)))
21     return rows
22 @ddt
23 class RegisterNewUserDDT(unittest.TestCase):
24     @classmethod
25     def setUpClass(cls):
26         cls.driver = webdriver.Chrome()
27         cls.driver.implicitly_wait(20)
28         cls.driver.maximize_window()
29         cls.driver.get('https://www.cnblogs.com/')
30         login_area = cls.driver.find_element_by_css_selector('#login_area')
31         register = login_area.find_element_by_link_text('注册')
32         register.click()
33     #读取excel文件的数据作为参数
34     @data(*get_data('data/reTest.xlsx'))
35     @unpack
36     def test_register_new_user(self,email,phone,login_name,nickname,password,confirm_password,expected_result):
37         driver = self.driver
38         self.assertTrue('用户注册 - 博客园' == driver.title)
39         # 定位注册页面各个字段
40         user_email = driver.find_element_by_id('Email')
41         user_phone_country = driver.find_element_by_id('CountryCode')
42         user_phone = driver.find_element_by_id('PhoneNum')
43         user_login_name = driver.find_element_by_id('LoginName')
44         user_nickname = driver.find_element_by_id('DisplayName')
45         user_password = driver.find_element_by_id('Password')
46         user_confirm_password = driver.find_element_by_id('ConfirmPassword')
47         #清除各字段的值(如果有)
48         user_email.clear()
49         user_phone.clear()
50         user_login_name.clear()
51         user_nickname.clear()
52         user_password.clear()
53         user_confirm_password.clear()
54         #输入邮箱、手机号等信息
55         user_email.send_keys(email)
56         user_phone.send_keys(phone)
57         user_login_name.send_keys(login_name)
58         user_nickname.send_keys(nickname)
59         user_password.send_keys(password)
60         user_confirm_password.send_keys(confirm_password)
61         #判断提示是否正确(这边应该有办法可以获取当前是第几次执行,下面的写法太死板了)
62         if phone == '1':
63             phone_error = driver.find_element_by_id('PhoneNum-error')
64             self.assertTrue(phone_error.text == expected_result)
65         elif login_name == 'b':
66             loginName_error = driver.find_element_by_id('LoginName-error')
67             self.assertTrue(loginName_error.text == expected_result)
68 
69     @classmethod
70     def tearDownClass(cls):
71         cls.driver.quit()
test_compare_1__2__3_ (__main__.MyTesting) ... ERROR
test_compare_2__4__5_ (__main__.MyTesting) ... ERROR


this is the setUp
ERROR: test_compare_1__2__3_ (__main__.MyTesting)
this is tearDown
----------------------------------------------------------------------
Traceback (most recent call last):
 File "D:\python\lib\site-packages\ddt.py", line 139, in wrapper
  return func(self, *args, **kwargs)
TypeError: test_compare() missing 1 required positional argument: 'b'

======================================================================
ERROR: test_compare_2__4__5_ (__main__.MyTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "D:\python\lib\site-packages\ddt.py", line 139, in wrapper
  return func(self, *args, **kwargs)
TypeError: test_compare() missing 1 required positional argument: 'b'

 

以上正是ddt 的学习总结,ddt
还有file_data(可以从json或许yaml中获取测试数据)的驱动格局,下篇继续啦。

您大概感兴趣的篇章:

  • 详解Python落成多进度异步事件驱动引擎
  • 一键解决python连接mysql驱动有关主题材料(windows版本)
  • 安装ElasticSearch寻找工具并安插Python驱动的章程
  • 用Python举行行为使得开采的入门教程
  • 详尽讲述用Python的Django框架测试驱动开拓的学科
  • python测试驱动开采实例
  • wxPython事件驱动实例详解

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有