python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
预期框架整理目标:
1.单个用例维护在单个.py文件中可单个执行,也可批量生成组件批量执行
2.对定位参数,定位方法,业务功能脚本,用例脚本,用例批量执行脚本,常用常量进行分层独立,各自维护在单独的.py文件中
3.加入日志,htlm报表,发送邮件功能
框架结构
结构说明:
config:配置部分,浏览器种类和定位信息维护在此处
constant:常量部分,固定不变的数据维护在此处
data:存放用于参数化的文本表格等文件
encapsulation:定位等selenium功能二次封装在此处
error_picture:存放错误截图
function:业务功能脚本维护在此处
log:存放log类
report:存放测试报告文件
test_case:存放用例文件
all_case.py:用来执行所有用例
debug_case.py:本人调试用的,可以忽略
tst.log:生成的日志
逐个介绍各个包下面的.py文件,并附上源码(说明见注释哈哈~):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-11 13:42
# config/config_01.py
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import * # config配置部分 # 浏览器种类维护在此处
browser_config = {
'ie': webdriver.Ie,
'chrome': webdriver.Chrome
} # 定位信息维护在此处,维护结构由外到内为:页面名称--页面下元素名称--元素的定位方式+参数
locat_config = {
'博客园首页': {
'找找看输入框': ['id', 'zzk_q'],
'找找看按钮': ['xpath', '//input[@value="找找看"]']
}
}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 13:20
# constant/constant_1.py # 常量部分(固定不变使用频繁的参数维护在此处)
LOGIN_URL = 'https://www.cnblogs.com/'
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 13:20
# encapsulation/encapsulation.py # 封装部分维护在此 from config.config_01 import locat_config
from log.log import Logger
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class UIHandle():
logger = Logger() # 构造方法,用来接收selenium的driver对象
@classmethod
def __init__(cls, driver):
cls.driver = driver # 输入地址
@classmethod
def get(cls, url):
cls.logger.loginfo(url)
cls.driver.get(url) # 关闭浏览器驱动
@classmethod
def quit(cls):
cls.driver.quit() # element对象(还可加入try,截图等。。。)
@classmethod
def element(cls, page, element):
# 加入日志
cls.logger.loginfo(page)
# 加入隐性等待
# 此处便可以传入config_o1中的dict定位参数
el = WebDriverWait(cls.driver, 10).until(EC.presence_of_element_located(locat_config[page][element]))
# 加入日志
cls.logger.loginfo(page+'OK')
return el
# element对象(还未完成。。。)
def elements(cls, page, element):
# 加入日志
cls.logger.loginfo(page)
# 加入隐性等待
WebDriverWait(cls.driver, 10)
els = cls.driver.find_elements(*locat_config[page][element])
# 注意返回的是list
return els # send_keys方法
@classmethod
def Input(cls, page, element, msg):
el = cls.element(page, element)
el.send_keys(msg) # click方法
@classmethod
def Click(cls, page, element):
el = cls.element(page, element)
el.click()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 13:22
# function/function_01.py
# 业务功能脚本(用例脚本可调用此处的功能脚本) from encapsulation.encapsulation import UIHandle
from constant.constant_1 import LOGIN_URL
from config.config_01 import browser_config
from time import sleep # 打开博客园首页,进行找找看搜索功能
def search(msg):
# 打开浏览器
driver = browser_config['chrome']()
# 传入driver对象
uihandle = UIHandle(driver)
#输入url地址
uihandle.get(LOGIN_URL)
# 调用二次封装后的方法,此处可见操作了哪个页面,哪个元素,msg是要插入的值,插入值得操作在另外一个用例文件中传入
uihandle.Input('博客园首页', '找找看输入框', msg)
uihandle.Click('博客园首页', '找找看按钮')
uihandle.quit()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-17 11:19
# log/log.py import logging
import logging.handlers # 日志类
class Logger():
LOG_FILE = 'tst.log' handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024, backupCount = 5) # 实例化handler
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' formatter = logging.Formatter(fmt) # 实例化formatter
handler.setFormatter(formatter) # 为handler添加formatter logger = logging.getLogger('tst') # 获取名为tst的logger
logger.addHandler(handler) # 为logger添加handler
logger.setLevel(logging.DEBUG)
def loginfo(self, message):
self.logger.info(message) def logdebug(self, message):
self.logger.debug(message)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-15 15:30
# test_case/test_case_1/start_case_01.py import unittest
from function.function_01 import *
# 用例
class Case_02(unittest.TestCase):
u'''哇塞好玩'''
def setUp(self):
pass def test_zzk(self):
u'''输入哇塞好玩后点击找找看'''
search("哇塞好玩")
print('打印方法名:test_zzk') def tearDown(self):
pass if __name__ == "__main__":
unittest.main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-05-10 16:34
# all_case.py import unittest
import HTMLTestRunner
import time,os,datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage # 取test_case文件夹下所有用例文件
def creatsuitel(lists):
testunit = unittest.TestSuite()
# discover 方法定义
discover = unittest.defaultTestLoader.discover(lists, pattern='start_*.py', top_level_dir=None)
#discover 方法筛选出来的用例,循环添加到测试套件中
for test_suite in discover:
for test_case in test_suite:
testunit.addTests(test_case)
print(testunit)
return testunit
list_1 = 'test_case\\test_case_1'
alltestnames = creatsuitel(list_1) #取前面时间加入到测试报告文件名中
now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
filename = "report\\"+now+'result.html' #定义个报告存放路径,支持相对路径。
fp = open(filename, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='Report_title', description='Report_description') if __name__ == "__main__":
# 执行测试用例集并生成报告
runner = unittest.TextTestRunner()
感谢@大师兄+@我去热饭的指导与帮助。
为什么选择?
有的人喜欢创造世界,他们做了程序员
有的人喜欢拯救世界,他们做了测试员
python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)的更多相关文章
- python+unittest框架第六天unittest之优化测试报告
今天的内容主要是,用第三方的HTMLRUNner 第三方的报告来优化之前第五天批量执行案例的测试报告.案例的部分看第五天的批量执行笔记~ HTMLRUNner他可以生成更美观的测试报告,基于前辈造的车 ...
- python+unittest框架第一天unittest之简单认识Test Fixure:测试固件【8月17更新】
20万的慢慢会实现的吧,hhh unittest框架,我就不在介绍了,百度有很详细的介绍. 我们只要了解: 1.unittest是单元测试框架 2.它提供用例组织与执行:在实际工作中案例可能有上百条, ...
- python+unittest框架第二天unittest之简单认识Test Suite:测试套件
今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的,当然也可以由多个子测试套件组成. 接下来看下如果构建测试套件,构建测试套件的方法: 1.用un ...
- python+unittest框架第四天unittest之批量执行案例
今天开始批量执行用例~,场景是这样的: 工作中我们可能有多个模块文件(.py)这些文件根据不同的业务类型或功能,测试案例分布在不同的模块文件下.前面的小示例中,我们的测试用例都是在一个文件中,直接运行 ...
- python+unittest框架第三天unittest之分离测试固件和公共代码,跳过案例的执行
我们在时间工作中,会将整个项目的代码分别放置多个模块中去编写.方便后期项目维护,比如,我们的web项目可能有多个IP地址,每个IP地址代表不同的测试环境.测试环境与Bat环境或者验收环境等.这就需要我 ...
- python unittest框架装饰器
要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...
- python unittest框架理解与总结(二)
unittest基本原理: ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用. ♦unittest是python的标准测试库,相比于其他测试 ...
- python unittest框架中addCleanup函数详解
接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)¶ Add ...
- python+unittest框架第四天unittest之断言(一)
unittest中的测试断言分两天总结,hhh其实内容不多,就是懒~ 断言的作用是什么? 答:设置测试断言以后,能帮助我们判断测试用例执行结果. 我们先看下unittest支持的断言有哪些: 对上面 ...
随机推荐
- C语言本身并不提供输入输出语句
C语言本身并不提供输入输出语句,输入和输出操作是由函数来实现的.在C标准函数库中提供了一些输入输出函数,例如,printf函数和scanf函数.在使用他们时,千万不要误认为他们是C语言提供的“输入输出 ...
- 拍照、本地图片工具类(兼容至Android7.0)
拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb ...
- 第十章 MyBatis入门
第十章 MyBatis入门10.1 MyBatis入门 优点:简单且功能强大.能够完全控制SQL语句.容易维护和修改 缺点:移植性不好 使用步骤: 1.下载 ...
- 【zzulioj 2127】 tmk射气球
比较简单的题,直接求空间中一个点到直线的距离而已,这道题说了直线和水平的平面 平行,我们可以先求投影到直线的距离,然后再算当前点到直线的距离. Description 有一天TMK在做一个飞艇环游世界 ...
- spring boot summer快速开发框架之《一、数据库操作》
快速开发演示: 目录结构: 本例采用的mysql自带的sakila示例库,脚本DumpAddress.sql. 步骤:1. 修改application.properties中数据库连接2. 在App. ...
- 数据仓库Hive数据导入导出
Hive库数据导入导出 1.新建表data hive (ebank)> create table data(id int,name string) > ROW FORMAT DELIMIT ...
- bzoj2125 最短路
Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...
- 在C#中使用类golang信道编程(一)
BusterWood.Channels是一个在C#上实现的信道的开源库.通过使用这个类库,我们可以在C#语言中实现类似golang和goroutine的信道编程方式.在这里我们介绍3个简单的信道的例子 ...
- 博弈论(Game Theory) - 04 - 纳什均衡
博弈论(Game Theory) - 04 - 纳什均衡 开始 纳什均衡和最大最小定理是博弈论的两大基石. 博弈不仅仅是对抗,也包括合作和迁就,纳什均衡能够解决这些问题,提供了在数学上一个完美的理论. ...
- Elasticsearch5中安装Elasticsearch-head插件
介绍 elasticsearch-head是一个用于管理Elasticsearch的web前端插件,搞过ES的同学应该都了解.该插件在es5中可以以独立服务的形式进行安装使用.本文将介绍如何操作. 相 ...