自动化测试框架:
1、基本组件:
1)配置文件管理
2)报告和日志文件输出
3)自定义库的封装(如:自定义搜索引擎类)
4)测试脚本文件(测试用例文件)
5)第三方插件
6)持续集成(git,svn,ant,maven,jenkins,我们会把这整合到jenkins,达到持续集成,一键执行测试脚本。)
下面简单介绍一下unittest测试框架:
unittest是一个单元测试框架,是Python编程的单元测试框架。共享测试用例中的初始化和关闭退出代码,最小单元是test,即一个测试用例
1)测试固件
包含“测试代码之前的准备部分”setUp()和“测试结束之后的清扫代码”tearDown()
2)测试用例
以test开头的函数
下面开始项目:
代码参考链接:first_framework_demo
新建项目,创建文件目录如下:
1)配置文件config.ini:
# -*- coding:utf-8 -*-
; 中文注释
[browserType]
;browserName = Firefox
browserName = Chrome
;drowserName = IE
[testServer]
URL = https://www.baidu.com
;URl = www.goole.com
2)logger.py文件:
import logging
import os.path
import time
class Logger(object):
def __init__(self, logger):
'''
指定保存日志的文件路径,日志级别以及调用文件
将日志存入到指定的文件中
:param logger:
'''
# 创建一个logger
self.logger = logging.getLogger(logger)
self.logger.setLevel(logging.DEBUG)
# 创建handler,写入日志文件
rq = time.strftime('%Y%m%d%H%M',time.localtime(time.time()))
log_path = os.path.dirname(os.path.abspath('.')) + '/logs/' + rq + '.log'
fh = logging.FileHandler(log_path)
fh.level = logging.INFO
# 创建handler, 用于输出控制台
ch = logging.StreamHandler()
ch.level = logging.INFO
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.formatter = formatter
ch.formatter = formatter
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def getlog(self):
return self.logger
3)brower_engine.py文件:
"""
浏览器引擎类
"""
import configparser
import os.path
from selenium import webdriver
from framework.logger import Logger
logger = Logger(logger="BrowserEngine").getlog()
class BrowserEngine(object):
def __init__(self, driver):
self.driver = driver
def open_browser(self):
config = configparser.ConfigParser()
file_path = os.path.dirname(os.path.abspath('.')) + '\config\config.ini'
print(file_path)
# 但是对于有BOM(如Windows下用记事本指定为utf-8)的文件,需要使用 utf-8-sig, 使用utf-8没办法。
# 【我没试过,http://blog.csdn.net/liujingqiu/article/details/77677256】
# 对于我写的代码 此处是utf-8-sig 或者 utf-8 都可以
config.read(file_path,encoding="utf-8")
browser = config.get("browserType", "browserName")
logger.info("You had select %s browser." % browser)
url = config.get("testServer", "URL")
logger.info("The test server url is: %s" % url)
if browser == "Firefox":
self.driver = webdriver.Firefox()
logger.info("firefox.")
elif browser == "Chrome":
self.driver = webdriver.Chrome()
logger.info("Chrome.")
elif browser == "IE":
self.driver = webdriver.Ie()
logger.info("Ie.")
self.driver.get(url)
logger.info("Open url: %s" % url)
self.driver.maximize_window()
logger.info("Maximize the current window.")
self.driver.implicitly_wait(10)
logger.info("Set implicitly wait 10 seconds.")
# self.driver = driver
return self.driver
def quit_browser(self):
self.driver.quit()
logger.info("Now, Close and quit the browser.")
4) baidu_homepage.py暂时为空
5)testsuits/baidu_search.py
"""
测试脚本
"""
import time
import unittest
from framework.brower_engine import BrowserEngine
"""
unittest
一个单元测试框架
共享测试用例中的初始化和关闭退出代码
最小单元是test,即一个测试用例
1)测试固件
包含“测试代码之前的准备部分”setUp()和“测试结束之后的清扫代码”tearDown()
2)测试用例
以test开头的函数
"""
class BaiduSearch(unittest.TestCase):
def setUp(self):
"""
前提准备工作
:return:
"""
self.engine = BrowserEngine.__new__(BrowserEngine)
self.driver = self.engine.open_browser()
def tearDown(self):
"""
测试结束后的操作
:return:
"""
self.engine.quit_browser()
# self.driver.quit()
def test_baidu_search(self):
self.driver.find_element_by_id('kw').send_keys("胡歌")
time.sleep(1)
try:
assert '胡歌' in self.driver.title
print('测试通过.')
except Exception as e:
print('测试失败.', format(e))
if __name__ == '__main__':
unittest.main()
运行测试脚本baidu_search.py,会在根目录下的logs文件生成日志文件.