怎样从0开始搭建一个测试框架_3——参数化
2018-01-26 15:32
686 查看
http://blog.csdn.net/huilan_same/article/details/76572466
我们已经把配置分离,并添加了log,接下来我们应该尝试着进行数据分离,进行参数化了。
我们修改file_reader.py文件,添加ExcelReader类,实现读取excel内容的功能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
我们添加title_line参数,用来声明是否在excel表格里有标题行,如果有标题行,返回dict列表,否则返回list列表,如下:
1
2
3
4
5
6
7
8
9
10
在data目录下创建baidu.xlsx,如下:
1
2
3
然后我们再修改我们可怜的小用例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
subTest是PY3 unittest里带的功能,PY2中没有,PY2中要想使用,需要用unittest2库。subTest是没有setUp和tearDown的,所以需要自己手动添加并执行。
现在我们就实现了数据分离,之后如果要搜索“张三”、“李四”,只要在excel里添加行就可以了。subTest参数化也帮助我们少写了很多用例方法,不用一遍遍在Case里copy and paste了。
所有的代码我都放到了GITHUB上传送,可以自己下载去学习,有什么好的建议或者问题,可以留言或者加我的QQ群:455478219讨论。
版权声明:本文为博主原创文章,转载请声明出处并添加原文链接。
本文已收录于以下专栏:
Python
Selenium自动化测试详解
从零搭建一个自动化测试框架
怎样从0开始搭建一个测试框架_3
这一步我们需要用到Python库xlrd我们已经把配置分离,并添加了log,接下来我们应该尝试着进行数据分离,进行参数化了。
我们修改file_reader.py文件,添加ExcelReader类,实现读取excel内容的功能:
""" 文件读取。YamlReader读取yaml文件,ExcelReader读取excel。 """ import yaml import os from xlrd import open_workbook class YamlReader: def __init__(self, yamlf): if os.path.exists(yamlf): self.yamlf = yamlf else: raise FileNotFoundError('文件不存在!') self._data = None @property def data(self): # 如果是第一次调用data,读取yaml文档,否则直接返回之前保存的数据 if not self._data: with open(self.yamlf, 'rb') as f: self._data = list(yaml.safe_load_all(f)) # load后是个generator,用list组织成列表 return self._data class SheetTypeError(Exception): pass class ExcelReader: """ 读取excel文件中的内容。返回list。 如: excel中内容为: | A | B | C | | A1 | B1 | C1 | | A2 | B2 | C2 | 如果 print(ExcelReader(excel, title_line=True).data),输出结果: [{A: A1, B: B1, C:C1}, {A:A2, B:B2, C:C2}] 如果 print(ExcelReader(excel, title_line=False).data),输出结果: [[A,B,C], [A1,B1,C1], [A2,B2,C2]] 可以指定sheet,通过index或者name: ExcelReader(excel, sheet=2) ExcelReader(excel, sheet='BaiDuTest') """ def __init__(self, excel, sheet=0, title_line=True): if os.path.exists(excel): self.excel = excel else: raise FileNotFoundError('文件不存在!') self.sheet = sheet self.title_line = title_line self._data = list() @property def data(self): if not self._data: workbook = open_workbook(self.excel) if type(self.sheet) not in [int, str]: raise SheetTypeError('Please pass in <type int> or <type str>, not {0}'.format(type(self.sheet))) elif type(self.sheet) == int: s = workbook.sheet_by_index(self.sheet) else: s = workbook.sheet_by_name(self.sheet) if self.title_line: title = s.row_values(0) # 首行为title for col in range(1, s.nrows): # 依次遍历其余行,与首行组成dict,拼到self._data中 self._data.append(dict(zip(title, s.row_values(col)))) else: for col in range(0, s.nrows): # 遍历所有行,拼到self._data中 self._data.append(s.row_values(col)) return self._data if __name__ == '__main__': y = 'E:\Test_framework\config\config.yml' reader = YamlReader(y) print(reader.data) e = 'E:/Test_framework/data/baidu.xlsx' reader = ExcelReader(e, title_line=True) print(reader.data)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
我们添加title_line参数,用来声明是否在excel表格里有标题行,如果有标题行,返回dict列表,否则返回list列表,如下:
# excel表格如下: # | title1 | title2 | # | value1 | value2 | # | value3 | value4 | # 如果title_line=True [{"title1": "value1", "title2": "value2"}, {"title1": "value3", "title2": "value4"}] # 如果title_line=False [["title1", "title2"], ["value1", "value2"], ["value3", "value4"]]
1
2
3
4
5
6
7
8
9
10
在data目录下创建baidu.xlsx,如下:
| search | | selenium 灰蓝 | | Python selenium |
1
2
3
然后我们再修改我们可怜的小用例:
import time import unittest from selenium import webdriver from selenium.webdriver.common.by import By from utils.config import Config, DRIVER_PATH, DATA_PATH from utils.log import logger from utils.file_reader import ExcelReader class TestBaiDu(unittest.TestCase): URL = Config().get('URL') excel = DATA_PATH + '/baidu.xlsx' locator_kw = (By.ID, 'kw') locator_su = (By.ID, 'su') locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a') def sub_setUp(self): self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe') self.driver.get(self.URL) def sub_tearDown(self): self.driver.quit() def test_search(self): datas = ExcelReader(self.excel).data for d in datas: with self.subTest(data=d): self.sub_setUp() self.driver.find_element(*self.locator_kw).send_keys(d['search']) self.driver.find_element(*self.locator_su).click() time.sleep(2) links = self.driver.find_elements(*self.locator_result) for link in links: logger.info(link.text) self.sub_tearDown() if __name__ == '__main__': unittest.main(verbosity=2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
subTest是PY3 unittest里带的功能,PY2中没有,PY2中要想使用,需要用unittest2库。subTest是没有setUp和tearDown的,所以需要自己手动添加并执行。
现在我们就实现了数据分离,之后如果要搜索“张三”、“李四”,只要在excel里添加行就可以了。subTest参数化也帮助我们少写了很多用例方法,不用一遍遍在Case里copy and paste了。
所有的代码我都放到了GITHUB上传送,可以自己下载去学习,有什么好的建议或者问题,可以留言或者加我的QQ群:455478219讨论。
版权声明:本文为博主原创文章,转载请声明出处并添加原文链接。
本文已收录于以下专栏:
Python
Selenium自动化测试详解
从零搭建一个自动化测试框架
相关文章推荐
- 怎样从0开始搭建一个测试框架_3——参数化
- 怎样从0开始搭建一个测试框架_6——PageObject
- 怎样从0开始搭建一个测试框架_0——总章
- 怎样从0开始搭建一个测试框架_7——接口
- 怎样从0开始搭建一个测试框架_7——接口
- 怎样从0开始搭建一个测试框架_1——配置
- 怎样从0开始搭建一个测试框架_8——断言
- 怎样从0开始搭建一个测试框架_2——日志
- 怎样从0开始搭建一个测试框架_9——抽取器
- 怎样从0开始搭建一个测试框架
- 怎样从0开始搭建一个测试框架_0——总章
- 怎样从0开始搭建一个既可以功能测试+又可以接口测试框架(灰蓝作品,qq号:396214358 )
- 怎样从0开始搭建一个测试框架_4——报告
- 怎样从0开始搭建一个测试框架_10——数据生成器
- 怎样从0开始搭建一个测试框架_1——配置
- 怎样从0开始搭建一个测试框架_11——支持方法
- 怎样从0开始搭建一个测试框架_8——断言
- 怎样从0开始搭建一个测试框架_4——报告
- 怎样从0开始搭建一个测试框架_9——抽取器
- 怎样从0开始搭建一个测试框架_10——数据生成器