
1、7年+测试经险,其中5年+金融(银行)领域业务经验,丰富的app\web\服务端测试经验. 2、4+年管理经验,有多次从0组建测试团队的经历,最多带过20+人的测试团队。
一、折线图: # -*- coding:utf-8 -*- import xlsxwriter # 创建一个excel workbook = xlsxwriter.Workbook("chart_line.xlsx") # 创建一个sheet worksheet = workbook.add_worksheet() # worksheet = workbook.add_worksheet("bug_analysis") # 自定义样式,加粗 bold = workbook.add_format({'bold': 1}) # --------1、准备数据并写入excel--------------- # 向excel中写入数据,建立图标时要用到 headings = ['Number', 'testA', 'testB'] data = [ ['2017-9-1', '2017-9-2', '2017-9-3', '2017-9-4', '2017-9-5', '2017-9-6'], [10, 40, 50, 20, 10, 50], [30, 60, 70, 50, 40, 30], ] # 写入表头 worksheet.write_row('A1', headings, bold) # 写入数据 worksheet.write_column('A2', data[0]) worksheet.write_column('B2', data[1]) worksheet.write_column('C2', data[2]) # --------2、生成图表并插入到excel--------------- # 创建一个柱状图(line chart) chart_col = workbook.add_chart({'type': 'line'}) # 配置第一个系列数据 chart_col.add_series({ # 这里的sheet1是默认的值,因为我们在新建sheet时没有指定sheet名 # 如果我们新建sheet时设置了sheet名,这里就要设置成相应的值 'name': '=Sheet1!$B$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$B$2:$B$7', 'line': {'color': 'red'}, }) # 配置第二个系列数据 chart_col.add_series({ 'name': '=Sheet1!$C$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$C$2:$C$7', 'line': {'color': 'yellow'}, }) # 配置第二个系列数据(用了另一种语法) # chart_col.add_series({ # 'name': ['Sheet1', 0, 2], # 'categories': ['Sheet1', 1, 0, 6, 0], # 'values': ['Sheet1', 1, 2, 6, 2], # 'line': {'color': 'yellow'}, # }) # 设置图表的title 和 x,y轴信息 chart_col.set_title({'name': 'The xxx site Bug Analysis'}) chart_col.set_x_axis({'name': 'Test number'}) chart_col.set_y_axis({'name': 'Sample length (mm)'}) # 设置图表的风格 chart_col.set_style(1) # 把图表插入到worksheet并设置偏移 worksheet.insert_chart('A10', chart_col, {'x_offset': 25, 'y_offset': 10}) workbook.close() 效果图: 二、柱状图: # -*- coding:utf-8 -*- import xlsxwriter # 创建一个excel workbook = xlsxwriter.Workbook("chart_column.xlsx") # 创建一个sheet worksheet = workbook.add_worksheet() # worksheet = workbook.add_worksheet("bug_analysis") # 自定义样式,加粗 bold = workbook.add_format({'bold': 1}) # --------1、准备数据并写入excel--------------- # 向excel中写入数据,建立图标时要用到 headings = ['Number', 'testA', 'testB'] data = [ ['2017-9-1', '2017-9-2', '2017-9-3', '2017-9-4', '2017-9-5', '2017-9-6'], [10, 40, 50, 20, 10, 50], [30, 60, 70, 50, 40, 30], ] # 写入表头 worksheet.write_row('A1', headings, bold) # 写入数据 worksheet.write_column('A2', data[0]) worksheet.write_column('B2', data[1]) worksheet.write_column('C2', data[2]) # --------2、生成图表并插入到excel--------------- # 创建一个柱状图(column chart) chart_col = workbook.add_chart({'type': 'column'}) # 配置第一个系列数据 chart_col.add_series({ # 这里的sheet1是默认的值,因为我们在新建sheet时没有指定sheet名 # 如果我们新建sheet时设置了sheet名,这里就要设置成相应的值 'name': '=Sheet1!$B$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$B$2:$B$7', 'line': {'color': 'red'}, }) # 配置第二个系列数据(用了另一种语法) chart_col.add_series({ 'name': '=Sheet1!$C$1', 'categories': '=Sheet1!$A$2:$A$7', 'values': '=Sheet1!$C$2:$C$7', 'line': {'color': 'yellow'}, }) # 配置第二个系列数据(用了另一种语法) # chart_col.add_series({ # 'name': ['Sheet1', 0, 2], # 'categories': ['Sheet1', 1, 0, 6, 0], # 'values': ['Sheet1', 1, 2, 6, 2], # 'line': {'color': 'yellow'}, # }) # 设置图表的title 和 x,y轴信息 chart_col.set_title({'name': 'The xxx site Bug Analysis'}) chart_col.set_x_axis({'name': 'Test number'}) chart_col.set_y_axis({'name': 'Sample length (mm)'}) # 设置图表的风格 chart_col.set_style(1) # 把图表插入到worksheet以及偏移 worksheet.insert_chart('A10', chart_col, {'x_offset': 25, 'y_offset': 10}) workbook.close() 效果图: PS: 其实前面两个图只变动一点:把 line 个性为 column chart_col = workbook.add_chart({'type': 'column'}) 三、饼图: # -*- coding:utf-8 -*- import xlsxwriter # 创建一个excel workbook = xlsxwriter.Workbook("chart_pie.xlsx") # 创建一个sheet worksheet = workbook.add_worksheet() # 自定义样式,加粗 bold = workbook.add_format({'bold': 1}) # --------1、准备数据并写入excel--------------- # 向excel中写入数据,建立图标时要用到 data = [ ['closed', 'active', 'reopen', 'NT'], [1012, 109, 123, 131], ] # 写入数据 worksheet.write_row('A1', data[0], bold) worksheet.write_row('A2', data[1]) # --------2、生成图表并插入到excel--------------- # 创建一个柱状图(pie chart) chart_col = workbook.add_chart({'type': 'pie'}) # 配置第一个系列数据 chart_col.add_series({ 'name': 'Bug Analysis', 'categories': '=Sheet1!$A$1:$D$1', 'values': '=Sheet1!$A$2:$D$2', 'points': [ {'fill': {'color': '#00CD00'}}, {'fill': {'color': 'red'}}, {'fill': {'color': 'yellow'}}, {'fill': {'color': 'gray'}}, ], }) # 设置图表的title 和 x,y轴信息 chart_col.set_title({'name': 'Bug Analysis'}) # 设置图表的风格 chart_col.set_style(10) # 把图表插入到worksheet以及偏移 worksheet.insert_chart('B10', chart_col, {'x_offset': 25, 'y_offset': 10}) workbook.close() 效果图: 参考资料: http://xlsxwriter.readthedocs.io/chart_examples.html http://xlsxwriter.readthedocs.io/chart.html
一、安装xlrd模块: 1、mac下打开终端输入命令: pip install xlrd 2、验证安装是否成功: 在mac终端输入 python 进入python环境 然后输入 import xlrd 不报错说明模块安装成功 二、常用方法: 1、导入模块: import xlrd 2、打开文件: x1 = xlrd.open_workbook("data.xlsx") 3、获取sheet: 获取所有sheet名字:x1.sheet_names() 获取sheet数量:x1.nsheets 获取所有sheet对象:x1.sheets() 通过sheet名查找:x1.sheet_by_name("test”) 通过索引查找:x1.sheet_by_index(3) # -*- coding:utf-8 -*- import xlrd import os filename = "demo.xlsx" filePath = os.path.join(os.getcwd(), filename) print filePath # 1、打开文件 x1 = xlrd.open_workbook(filePath) # 2、获取sheet对象 print 'sheet_names:', x1.sheet_names() # 获取所有sheet名字 print 'sheet_number:', x1.nsheets # 获取sheet数量 print 'sheet_object:', x1.sheets() # 获取所有sheet对象 print 'By_name:', x1.sheet_by_name("test") # 通过sheet名查找 print 'By_index:', x1.sheet_by_index(3) # 通过索引查找 输出: sheet_names: [u' plan', u'team building', u'modile', u'test'] sheet_number: 4 sheet_object: [<xlrd.sheet.Sheet object at 0x10244c190>, <xlrd.sheet.Sheet object at 0x10244c150>, <xlrd.sheet.Sheet object at 0x10244c110>, <xlrd.sheet.Sheet object at 0x10244c290>] By_name: <xlrd.sheet.Sheet object at 0x10244c290> By_index: <xlrd.sheet.Sheet object at 0x10244c290> 4、获取sheet的汇总数据: 获取sheet名:sheet1.name 获取总行数:sheet1.nrows 获取总列数:sheet1.ncols # -*- coding:utf-8 -*- import xlrd import os from datetime import date,datetime filename = "demo.xlsx" filePath = os.path.join(os.getcwd(), filename) print filePath # 打开文件 x1 = xlrd.open_workbook(filePath) # 获取sheet的汇总数据 sheet1 = x1.sheet_by_name("plan") print "sheet name:", sheet1.name # get sheet name print "row num:", sheet1.nrows # get sheet all rows number print "col num:", sheet1.ncols # get sheet all columns number 输出: sheet name: plan row num: 31 col num: 11 5、单元格批量读取: a)行操作: sheet1.row_values(0) # 获取第一行所有内容,合并单元格,首行显示值,其它为空。 sheet1.row(0) # 获取单元格值类型和内容 sheet1.row_types(0) # 获取单元格数据类型 # -*- coding:utf-8 -*- import xlrd import os from datetime import date,datetime filename = "demo.xlsx" filePath = os.path.join(os.getcwd(), filename) x1 = xlrd.open_workbook(filePath) sheet1 = x1.sheet_by_name("plan") # 单元格批量读取 print sheet1.row_values(0) # 获取第一行所有内容,合并单元格,首行显示值,其它为空。 print sheet1.row(0) # 获取单元格值类型和内容 print sheet1.row_types(0) # 获取单元格数据类型 输出: [u'learning plan', u'', u'', u'', u'', u'', u'', u'', 123.0, 42916.0, 0] [text:u'learning plan', empty:u'', empty:u'', empty:u'', empty:u'', empty:u'', empty:u'', empty:u'', number:123.0, xldate:42916.0, bool:0] array('B', [1, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4]) b) 表操作 sheet1.row_values(0, 6, 10) # 取第1行,第6~10列(不含第10表) sheet1.col_values(0, 0, 5) # 取第1列,第0~5行(不含第5行) sheet1.row_slice(2, 0, 2) # 获取单元格值类型和内容 sheet1.row_types(1, 0, 2) # 获取单元格数据类型 # -*- coding:utf-8 -*- import xlrd import os from datetime import date,datetime filename = "demo.xlsx" filePath = os.path.join(os.getcwd(), filename) print filePath # 1、打开文件 x1 = xlrd.open_workbook(filePath) sheet1 = x1.sheet_by_name("plan") # 列操作 print sheet1.row_values(0, 6, 10) # 取第1行,第6~10列(不含第10表) print sheet1.col_values(0, 0, 5) # 取第1列,第0~5行(不含第5行) print sheet1.row_slice(2, 0, 2) # 获取单元格值类型和内容,同sheet1.row(0) print sheet1.row_types(1, 0, 2) # 获取单元格数据类型 输出: [u'', u'', 123.0, 42916.0] [u'learning plan', u'\u7f16\u53f7', 1.0, 2.0, 3.0] [number:1.0, text:u'\u7ba1\u7406\u5b66\u4e60'] array('B', [1, 1]) 6、特定单元格读取: a) 获取单元格值: sheet1.cell_value(1, 2) sheet1.cell(1, 2).value sheet1.row(1)[2].value b) 获取单元格类型: sheet1.cell(1, 2).ctype sheet1.cell_type(1, 2) sheet1.row(1)[2].ctype # -*- coding:utf-8 -*- import xlrd import os from datetime import date,datetime filename = "demo.xlsx" filePath = os.path.join(os.getcwd(), filename) x1 = xlrd.open_workbook(filePath) sheet1 = x1.sheet_by_name("plan") # 特定单元格读取 # 取值 print sheet1.cell_value(1, 2) print sheet1.cell(1, 2).value print sheet1.row(1)[2].value #取类型 print sheet1.cell(1, 2).ctype print sheet1.cell_type(1, 2) print sheet1.row(1)[2].ctype 7、(0,0)转换A1: xlrd.cellname(0, 0) # (0,0)转换成A1 xlrd.cellnameabs(0, 0) # (0,0)转换成$A$1 xlrd.colname(30) # 把列由数字转换为字母表示 # -*- coding:utf-8 -*- import xlrd import os filename = "demo.xlsx" filePath = os.path.join(os.getcwd(), filename) # 打开文件 x1 = xlrd.open_workbook(filePath) sheet1 = x1.sheet_by_name("plan") # (0,0)转换成A1 print xlrd.cellname(0, 0) # (0,0)转换成A1 print xlrd.cellnameabs(0, 0) # (0,0)转换成$A$1 print xlrd.colname(30) # 把列由数字转换为字母表示 输出: A1 $A$1 AE 8、数据类型: 空:0 字符串:1 数字:2 日期:3 布尔:4 error:5
用例的管理问题解决了后,接下来要考虑的就是报告我问题了,这里生成测试报告主要用到 HTMLTestRunner.py 这个模块,下面简单介绍一下如何使用: 一、下载HTMLTestRunner下载: 这个模块不能通过pip安装,只能下载安装,下载地址如下: python2.x版本:http://tungwaiyip.info/software/HTMLTestRunner.html python3.x版本:http://hzqldjb.blog.51cto.com/9587820/1590802 二、mac下配置: 1、终端进入python环境 2、输入: import sys print sys.path 3、找到site-packages文件夹的路径并将下载的 HTMLTestRunner.py 文件拷贝到此的文件夹下 4、在python环境下,输入 import HTMLTestRunner 不报错即安装成功 三、使用该模块生成报告: 1、目录结构 case包下面有baidu,httpbin两个包 每个包下面分别有两个测试的py文件 每个test_00x.py文件里各有2个test case run_all_case.py文件:用来执行所有的test case且生成测试报告 2、运行后生成报告如下: 3、run_all_case.py代码如下: # -*- coding:utf-8 -*- import unittest import os import time import HTMLTestRunner # 用例路径 case_path = os.path.join(os.getcwd()) # 报告存放路径 report_path = os.path.join(os.getcwd(), 'report') print report_path def all_case(): discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) print discover return discover if __name__ == '__main__': # 1、获取当前时间,这样便于下面的使用。 now = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time())) # 2、html报告文件路径 report_abspath = os.path.join(report_path, "result_"+now+".html") # 3、打开一个文件,将result写入此file中 fp = open(report_abspath, "wb") runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'接口自动化测试报告,测试结果如下:', description=u'用例执行情况:') # 4、调用add_case函数返回值 runner.run(all_case()) fp.close()
前面五节主要介绍了环境搭建和requests库的使用,可以使用这些进行接口请求的发送。但是如何管理接口案例?返回结果如何自动校验?这些内容光靠上面五节是不行的,因此从本节开始我们引入python单元测试框架 unittest,用它来处理批量用例管理,校验返回结果,初始化工作以及测试完成后的环境复原工作等等。 一、单个用例管理起来比较简单,参考如下图,单个用例一般多用在调试的时候: 二、代码如下: # -*- coding:utf-8 -*- # 单个用例执行 # 1、导入模块 import unittest # 2、继承自unittest.TestCase类 class TestOne(unittest.TestCase): # 3、配置环境:进行测试前的初始化工作 def setUp(self): print '\ncases before' pass # 4、定义测试用例,名字以“test”开头 def test_add(self): '''test add method''' print 'add...' a = 3 + 4 b = 7 # 5、定义assert断言,判断测试结果 self.assertEqual(a, b) def test_sub(self): '''test sub method''' print 'sub...' a = 10 - 5 b = 4 self.assertEqual(a, b) # 6、清理环境 def tearDown(self): print 'case after' pass # 7、该方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们 if __name__ == '__main__': unittest.main() 输出: Ran 2 tests in 0.001s OK cases before add... case after cases before sub... case after Process finished with exit code 0
我们日常项目中的接口测试案例肯定不止一个,当案例越来越多时我们如何管理这些批量案例?如何保证案例不重复?如果案例非常多(成百上千,甚至更多)时如何保证案例执行的效率?如何做(批量)测试数据的管理?如何做到数据与脚本分离? 以上这些问题才是我们自动化测试中要重点考虑的问题,单个用例其实并不难。 来看一下在unittest框架中如何管理批量案例: 一、手工加载批量用例: # -*- coding:utf-8 -*- # 批量用例执行--手工加载 import unittest class TestOne(unittest.TestCase): def setUp(self): print '\ncases before' pass def test_add(self): '''test add method''' print 'add...' a = 3 + 4 b = 7 self.assertEqual(a, b) def test_sub(self): '''test sub method''' print 'sub...' a = 10 - 5 b = 5 self.assertEqual(a, b) def tearDown(self): print 'case after' pass if __name__ == '__main__': # 1、构造用例集 suite = unittest.TestSuite() # 2、执行顺序是安加载顺序:先执行test_sub,再执行test_add suite.addTest(TestOne("test_sub")) suite.addTest(TestOne("test_add")) # 3、实例化runner类 runner = unittest.TextTestRunner()# 4、执行测试 runner.run(suite) 二、自动加载批量用例: # -*- coding:utf-8 -*- # 批量用例执行--自动加载 import unittest import os class TestOne(unittest.TestCase): def setUp(self): print '\ncases before' pass def test_add(self): '''test add method''' print 'add...' a = 3 + 4 b = 7 self.assertEqual(a, b) def test_sub(self): '''test sub method''' print 'sub...' a = 10 - 5 b = 5 self.assertEqual(a, b) def tearDown(self): print 'case after' pass if __name__ == '__main__': # 1、设置待执行用例的目录 test_dir = os.path.join(os.getcwd()) # 2、自动搜索指定目录下的cas,构造测试集,执行顺序是命名顺序:先执行test_add,再执行test_sub discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py') # 实例化TextTestRunner类 runner = unittest.TextTestRunner() # 使用run()方法运行测试套件(即运行测试套件中的所有用例) runner.run(discover) 以上只是解决了如何管理批量案例的问题,其它的问题如何做(批量)测试数据的管理?如何做到数据与脚本分离?后续在介绍。