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
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="找找看"]‘]
    }
}

config_01.py

1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # @Time    : 2017-05-15 13:20
4
5 # 常量部分(固定不变使用频繁的参数维护在此处)
6 LOGIN_URL = ‘https://www.cnblogs.com/‘

constant_1.py

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-05-15 13:20
 4
 5 # 封装部分维护在此
 6
 7 from config.config_01 import locat_config
 8 from log.log import Logger
 9 from selenium.webdriver.support.wait import WebDriverWait
10
11 class UIHandle():
12     logger = Logger()
13
14     # 构造方法,用来接收selenium的driver对象
15     @classmethod
16     def __init__(cls, driver):
17         cls.driver = driver
18
19     # 输入地址
20     @classmethod
21     def get(cls, url):
22         cls.logger.loginfo(url)
23         cls.driver.get(url)
24
25     # 关闭浏览器驱动
26     @classmethod
27     def quit(cls):
28         cls.driver.quit()
29
30     # element对象(还可加入try,截图等。。。)
31     @classmethod
32     def element(cls, page, element):
33         # 加入日志
34         cls.logger.loginfo(page)
35         # 加入隐性等待
36         WebDriverWait(cls.driver, 10)
37         # 此处便可以传入config_o1中的dict定位参数
38         el = cls.driver.find_element(*locat_config[page][element])
39         # 加入日志
40         cls.logger.loginfo(page+‘OK‘)
41         return el
42     # element对象(还未完成。。。)
43     def elements(cls, page, element):
44         # 加入日志
45         cls.logger.loginfo(page)
46         # 加入隐性等待
47         WebDriverWait(cls.driver, 10)
48         els = cls.driver.find_elements(*locat_config[page][element])
49         # 注意返回的是list
50         return els
51
52     # send_keys方法
53     @classmethod
54     def Input(cls, page, element, msg):
55         el = cls.element(page, element)
56         el.send_keys(msg)
57
58     # click方法
59     @classmethod
60     def Click(cls, page, element):
61         el = cls.element(page, element)
62         el.click()

encapsulation.py

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-05-15 13:22
 4
 5 # 业务功能脚本(用例脚本可调用此处的功能脚本)
 6
 7 from encapsulation.encapsulation import UIHandle
 8 from constant.constant_1 import LOGIN_URL
 9 from config.config_01 import browser_config
10 from time import sleep
11
12 # 打开博客园首页,进行找找看搜索功能
13 def search(msg):
14     # 打开浏览器
15     driver = browser_config[‘chrome‘]()
16     # 传入driver对象
17     uihandle = UIHandle(driver)
18     #输入url地址
19     uihandle.get(LOGIN_URL)
20     # 调用二次封装后的方法,此处可见操作了哪个页面,哪个元素,msg是要插入的值,插入值得操作在另外一个用例文件中传入
21     uihandle.Input(‘博客园首页‘, ‘找找看输入框‘, msg)
22     uihandle.Click(‘博客园首页‘, ‘找找看按钮‘)
23     uihandle.quit()

function_01.py

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-05-17 11:19
 4 import logging
 5 import logging.handlers
 6
 7 # 日志类
 8 class Logger():
 9     LOG_FILE = ‘tst.log‘
10
11     handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024, backupCount = 5) # 实例化handler
12     fmt = ‘%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s‘
13
14     formatter = logging.Formatter(fmt)   # 实例化formatter
15     handler.setFormatter(formatter)      # 为handler添加formatter
16
17     logger = logging.getLogger(‘tst‘)    # 获取名为tst的logger
18     logger.addHandler(handler)           # 为logger添加handler
19     logger.setLevel(logging.DEBUG)
20     def loginfo(self, message):
21         self.logger.info(message)
22
23     def logdebug(self, message):
24         self.logger.debug(message)

log.py

 1 #!/usr/bin/env python
 2 #!/usr/bin/env python
 3 # -*- coding: utf-8 -*-
 4 # @Time    : 2017-05-15 15:30
 5 import unittest
 6 from function.function_01 import *
 7 # 用例
 8 class Case_02(unittest.TestCase):
 9     u‘‘‘哇塞好玩‘‘‘
10     def setUp(self):
11         pass
12
13     def test_zzk(self):
14         u‘‘‘输入哇塞好玩后点击找找看‘‘‘
15         search("哇塞好玩")
16         print(‘打印方法名:test_zzk‘)
17
18     def tearDown(self):
19         pass
20
21 if __name__ == "__main__":
22     unittest.main()

start_case_01.py

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-05-10 16:34
 4 import unittest
 5 import HTMLTestRunner
 6 import time,os,datetime
 7 import smtplib
 8 from email.mime.text import MIMEText
 9 from email.mime.multipart import MIMEMultipart
10 from email.mime.image import MIMEImage
11
12
13
14 # 取test_case文件夹下所有用例文件
15 def creatsuitel(lists):
16     testunit = unittest.TestSuite()
17     # discover 方法定义
18     discover = unittest.defaultTestLoader.discover(lists, pattern=‘start_*.py‘, top_level_dir=None)
19     #discover 方法筛选出来的用例,循环添加到测试套件中
20     for test_suite in discover:
21         for test_case in test_suite:
22             testunit.addTests(test_case)
23             print(testunit)
24     return testunit
25 list_1 = ‘test_case\\test_case_1‘
26 alltestnames = creatsuitel(list_1)
27
28 #取前面时间加入到测试报告文件名中
29 now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
30 filename = "report\\"+now+‘result.html‘ #定义个报告存放路径,支持相对路径。
31 fp = open(filename, ‘wb‘)
32 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=‘Report_title‘, description=‘Report_description‘)
33
34 if __name__ == "__main__":
35     # 执行测试用例集并生成报告
36     runner = unittest.TextTestRunner()

all_case.py

架子比较简陋,可以跑通,感谢@大师兄[email protected]我去热饭的指导与帮助。框架后续还会进一步优化,欢迎建议,指点,本人QQ:915069792

为什么选择?

有的人喜欢创造世界,他们做了程序员

有的人喜欢拯救世界,他们做了测试员

时间: 2024-09-30 21:29:32

python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)的相关文章

Python Unittest框架用例执行失败自动截图

原生的unittest框架是不支持case失败后自动截图功能,网上的解决办法,大体上分为两种: 1.加装饰器 可参考让unittest框架在fail时自动截图的装饰器.给测试用例添加多个装饰器的问题 (python unittest.TestCase) 2.封装断言 可参考Getting Python's unittest results in a tearDown() method.python 自动化测试,求助:如何判断用例断言失败后自动截图 原文地址:https://www.cnblogs

python unittest框架装饰器

要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单元测试的处理逻辑和UI的对应关系,根据分层自动化的测试思想, UI>>接口>>最底层就是单元,对于单元级别的自动化测试, 是白盒测试范畴, 用一段代码去测试一段代码, 而我们则是需要利用单元测试框架的一些组织驱动单元来编写我们的自动化测试脚本, 而unittest是python自带的单

python unittest框架

unittest模块提供了单元测试的组件,方便开发人员进行自测. 一.unittest中的重要概念: 测试用例:测试用例对象是最小的测试单位,针对指定的输入来测试期待的输出.由类TestCase的派生类或FunctionTestCase类来创建的. 测试固件:代表了测试相关的准备和清除工作,比如在一个测试进行之前需要创建数据库连接,测试结束之后需要关闭数据库连接.测试固件是在TestCase子类中进行重载的setUp和tearDown函数实现的.每个测试用例执行前后都会自动执行setUp和tea

python unittest框架中addCleanup函数详解

接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)? Add a function to be called after tearDown() to cleanup resources used during the test. Functions will be called in reverse order to the order they are a

Python unittest框架实现appium登录

import unittest from appium.webdriver import webdriver from ddt import data,ddt,unpack class MyTestCase(unittest.TestCase): def setUp(self):#准备的过程 desired_caps = {} desired_caps["platformName"] = "Android" desired_caps["platformVe

selenium + python自动化测试unittest框架学习(一)selenium原理及应用

unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻.unittest框架学习需要掌握以下知识点: (1)Selenium原理及工具使用 (2)webdriver元素定位,id,name,class name,css seletor,xpath (3)python语言基础,模块,参数化,语言,装饰器 (4)unittest框架认识及学习:模块化,断言,参数化,数

selenium + python自动化测试unittest框架学习(二)

1.unittest单元测试框架文件结构 unittest是python单元测试框架之一,unittest测试框架的主要文件结构: File >report >all_case.py >test_case >__init__.py >test_case1..... >public >__init__.py >login.py >loginout.py test_case文件夹主要存放测试用例,且测试用例命名以test_开头 public文件夹是test

Python单元测试框架unittest之深入学习

前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图(下面的类图以及解释均来源于网络,原文链接): 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一个完整的测试流程,包括测

从GitHub中整理出来的15个最受欢迎的Python开源框架,你喜欢哪个

从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. Diesel:基于Greenlet的事件I/O框架 Diesel提供一个