知识点:
1、Java单元测试工具: junit TestNG Pthon单元测试工具: unittest pytest pyunit 2、unittest原理:所有测试用例都必须在一个类里面,这个类继承了unittest中的TestCase类,下面的每一个测试用例都是一个测试方法,每一个测试方法以test开头, (属于成员方法),然后在主方法里面运行unittest.main()来批量执行测试用例
3、suite套件的两种方法:
1、suite = unittest.TestSuite() suite.addTest(Case01('runTest')) suite.addTest(Case02('runTest')) suite.addTest(Case03('runTest'))
2、suite = unittest.defaultTestLoader.discover(start_dir='./cases/', pattern='case01*.py')
4、批量运行用例三种方法: 1、unittest.main() 2、unittest.TextTestRunner().run(suite)
3、filename = time.strftime('%Y%m%d_%H_%M_%S', time.localtime(time.time()))+'.html' fp = open('./'+filename, 'wb')
HTMLTestRunnerCN.HTMLTestRunner( stream=fp,title='慧测自动化测试报告',description='11111',tester='张三' ).run(suite)
4、运行测试用例方法
方法一:在同一个文件中,unittest.main()执行测试用例
unittest.main()
方法二:suite套件执行测试用例
case文件夹 case01.py文件(case02/case03以此类推) #coding:utf-8 #登录 from selenium import webdriver import time import unittest class Case01(unittest.TestCase): #对类进行注释或者对方法进行注释 '''测试的是登录,正向流程''' def runTest(self): '''11111111''' driver = webdriver.Firefox() self.driver = driver driver.maximize_window() driver.implicitly_wait(5) driver.get('http://www.huicewang.com/ecshop/user.php') driver.find_element_by_name('username').send_keys('zach') driver.find_element_by_name('password').send_keys('1234567') driver.find_element_by_name('submit').click() time.sleep(8) try: username = driver.find_element_by_xpath("//font[@id='ECS_MEMBERZONE']/font/font[@class='f4_b']").text except: username = '' self.assertEqual(username, 'zach', '登录失败') print '登录成功' def tearDown(self): self.driver.close()
|
run.py文件 import unittest from cases.case01 import Case01 from cases.case02 import Case02 from cases.case03 import Case03 #直接引入【类】级别即可 suite = unittest.TestSuite() #实例化一个测试套件 suite.addTest(Case01('runTest')) #套件添加测试用例格式:suite.addTest(类名(方法名)) suite.addTest(Case02('runTest')) suite.addTest(Case03('runTest')) unittest.TextTestRunner().run(suite) #批量执行用例集 |
缺点:
当用例过多时,需要加100遍
方法三:批量查找,批量加载discover
discover函数参数解释:起始路径+匹配对象+顶级路径,discover函数返回一个suite对象
默认测试加载器unittest.defaultTestLoader def discover(self, start_dir, pattern='test*.py', top_level_dir=None): #返回一个suite对象 start_dir:起始路径 pattern:匹配原则 top_level_dir:顶级搜索路径,如果None,默认从当前路径下开始搜索 suite = unittest.defaultTestLoader.discover(start_dir='./cases/', pattern='case01*.py') #返回一个suite对象,用suite接一下 unittest.TextTestRunner().run(suite) |
5、unittest组织你的测试用例?什么维度?
35分钟28秒
1、所有测试用例放在一个文件的一个类中--------不支持
2、一个文件里面只有一个类,一个类中只有一个方法,一个方法就是一个测试用例------拆的太细,不支持
优点:分别独立,维护起来方便
缺点:有共通数据,比如登录页面胡起始地址,跨文件之间很难传输,需要写好几遍
3、3个文件,login.py有两个类,一个是正向类,一个是反向类
signup.py文件
order.py文件
4、一个正向文件
一个反向文件
具体看需求,看使用方便
6、输出测试报告1----HTMLTestRunner
python所有的包安装方式:
1、在线安装pip install
2、源码包安装:python setup.py install
3、如果项目是一个很小的文件:直接放在python27根路径下或者Lib目录下
验证HTMLTestRunner.py安装成功 在run.py文件中import HTMLTestRunner---不支持中文 错误信息匀日志中查看,不要匀控制台查看
import unittest import HTMLTestRunner import time from cases.case01 import Case01 from cases.case02 import Case02 from cases.case03 import Case03 from cases.case04 import Case04 suite = unittest.TestSuite() suite.addTest(Case04('runTest')) suite.addTest(Case02('test')) suite.addTest(Case03('test')) suite = unittest.defaultTestLoader.discover(start_dir="./cases/",pattern='case01*.py') fp = open("./report.html",'wb') HTMLTestRunner.HTMLTestRunner(stream=fp,title="XXXXX", description='11111').run(suite) |
生成测试报告样式 7、输出测试报告2----HTMLTestRunnerCN
import unittest import HTMLTestRunnerCN import time |
from cases.case01 import Case01 from cases.case02 import Case02 from cases.case03 import Case03 from cases.case04 import Case04 suite = unittest.TestSuite() suite.addTest(Case04('runTest')) suite.addTest(Case02('test')) suite.addTest(Case03('test')) suite = unittest.defaultTestLoader.discover(start_dir="./cases/",pattern='case01*.py') fp = open("./report.html",'wb') HTMLTestRunnerCN.HTMLTestRunner(stream=fp, verbosity=1,title='慧测报告',description='123456',tester='袁路平').run(suite) |
8、报告命名--用python时间戳time
#coding:utf-8 import time print time.time()---------------------------------------------------------时间戳 print time.ctime(time.time())---------------------------------------------美式时间格式化Wed Aug 08 00:25:43 2018 print time.ctime()--------------------------------------------------------Wed Aug 08 00:25:43 2018 print time.localtime(time.time()) #将秒数转化时间元组----------------------time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=0, tm_min=25, tm_sec=43, tm_wday=2, tm_yday=220, tm_isdst=0) print time.strftime('%Y_%m_%d %H:%M:%S',time.localtime(time.time()))------标准格式 |
import unittest import HTMLTestRunnerCN import time from cases.case01 import Case01 from cases.case02 import Case02 from cases.case03 import Case03 from cases.case04 import Case04 suite = unittest.TestSuite() suite.addTest(Case04('runTest')) suite.addTest(Case02('test')) suite.addTest(Case03('test')) title=time.strftime('%Y %m %d-%H %M %S',time.localtime(time.time()))+'.html' fp = open("./"+title,'wb') HTMLTestRunnerCN.HTMLTestRunner(stream=fp, verbosity=1,title='慧测报告',description='123456',tester='袁路平').run(suite) |
9、requests urllib模块:专门来处理http请求,用来模拟http客户端发送和接受请求----不讲解
DOS窗口安装requests pip install requests 或者源码安装:解压到某个路径下,文件中含有setup.py文件,DOS窗口执行-------python setup.py install 验证安装好方式: import requests 引包成功即可 print requests.get('http://www.baidu.com').status_code----获取get请求百度首页状态码 |
练习一:获取精品推荐区图片链接地址正确 首先编辑case04.py文件,获取图片链接地址返回码 #coding:utf-8 import unittest from selenium import webdriver import requests class Case04(unittest.TestCase): '''检查首页精品推荐区域图片的有效性''' def runTest(self): driver = webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(5) driver.get('http://www.huicewang.com/ecshop/') imgs = driver.find_elements_by_xpath("//div[@id='show_best_area']/div[@class='goodsItem']/a/img") links = [] for img in imgs: links.append(img.get_attribute('src')) #将图片地址全部拿回来 for l in links: if requests.get(l).status_code != 200: print l else: print '链接正常' run.py文件 suite = unittest.defaultTestLoader.discover(start_dir='./cases/', pattern='case04*.py') filename = time.strftime('%Y%m%d_%H_%M_%S', time.localtime(time.time()))+'.html' fp = open('./'+filename, 'wb') HTMLTestRunnerCN.HTMLTestRunner( stream=fp,title='慧测自动化测试报告',description='11111',tester='张三' ).run(suite) |
driver跨方法使用,需要在第一个方法中将driver存放在类中,下面的函数才可以直接self.driver调用
缺少断言脚本
添加断言脚本 #coding:utf-8 #登录 from selenium import webdriver import time import unittest class Case01(unittest.TestCase): '''测试的是登录,正向流程''' def runTest(self): '''11111111''' driver = webdriver.Firefox() self.driver = driver #将driver存放在类中,那么driver跨方法也可以用 driver.maximize_window() driver.implicitly_wait(5) driver.get('http://www.huicewang.com/ecshop/user.php') driver.find_element_by_name('username').send_keys('zach') driver.find_element_by_name('password').send_keys('1234567') driver.find_element_by_name('submit').click() time.sleep(8) try: username = driver.find_element_by_xpath("//font[@id='ECS_MEMBERZONE']/font/font[@class='f4_b']").text except: username = '' self.assertEqual(username, 'zach', '登录失败') #Case01类调用了TestCase的assertEqual方法,所有要用self print '登录成功' #assertEqual断言成功时,打印“登录成功” def tearDown(self): self.driver.close()#已经在runTest函数中将driver存放在类中了,跨方法 或者:在runTest中全部使用self.driver #coding:utf-8 #登录 from selenium import webdriver import time import unittest class Case01(unittest.TestCase): '''测试的是登录,正向流程''' def runTest(self): '''11111111''' driver = webdriver.Firefox() self.driver = driver #将driver存放在类中,那么driver跨方法也可以用 self.driver.maximize_window() self.driver.implicitly_wait(5) self.driver.get('http://www.huicewang.com/ecshop/user.php') self.driver.find_element_by_name('username').send_keys('ylpaj') self.driver.find_element_by_name('password').send_keys('ylpaj5211314') self.driver.find_element_by_name('submit').click() time.sleep(8) try: username = driver.find_element_by_xpath("//font[@id='ECS_MEMBERZONE']/font/font[@class='f4_b']").text except: username = '' self.assertEqual(username, 'ylpaj', '登录失败') #Case01类调用了TestCase的assertEqual方法,所有要用self print '登录成功' def tearDown(self): self.driver.close()#已经在runTest函数中将driver存放在类中了,跨方法 |