UI自动化笔记(四):框架搭建

  知识点: 

 
  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存放在类中了,跨方法

 























































posted @ 2018-07-08 10:55  ylpaj  阅读(238)  评论(0编辑  收藏  举报