参考博客:http://blog.youkuaiyun.com/huilan_same/article/details/76572428
这个博主的系列博客写的非常不错,像我这样的小白一看就会写了,简单易懂。可惜的是已经断更半年了....
pyyaml模块简单使用
# 读取yaml文件
read_yaml = yaml.load(file('config.yaml','r'))
data = {'name': 'lily',
'sex': 'girl',
'age': '6'}
# 写入yaml文件
write_yaml = yaml.dump(data, default_flow_style=False)
with open('config.yaml', 'w') as f:
f.write(write_yaml)
一、读取,写入配置文件
第一步是把测试用例中所需要用到的参数抽离出来,存放在配置文件中。读取与写入配置文件的模块,这里选择的是灰蓝博客使用的pyyaml,可用于读取写入yaml格式的文件。这里还推荐python内置的configparser模块,也比较简单。创建yaml文件读取写入类
感觉这样写好像照抄别人的博客呀,写完这个接下来的类我就一笔带过了。
#!/usr/bin/env python
#coding=utf-8
import yaml
import os
from xlrd import open_workbook
from xlutils.copy import copy
from xlwt import Style
class FileNotFoundError(StandardError):
pass
class YamlReader(object):
def __init__(self, yaml_file):
# 判断路径中是否存在文件
if os.path.exists(yaml_file):
self.yaml_file = yaml_file
else:
raise FileNotFoundError('File not found!%s')
self._data = None
@property
def data(self):
# 读取yaml配置文件属性,并存入到data变量中
if not self._data:
with open(self.yaml_file, 'rb') as f:
self._data = list(yaml.safe_load_all(f))
return self._data
@data.setter
def data(self, value):
# 写入配置文件
with open(self.yaml_file, 'r+') as f:
f.write(value)
创建配置文件读取类
#!/usr/bin/env python
#coding=utf-8
import os
from utils.file_reader import YamlReader
# 配置项目文件路径,增加可移植性
BASE_PATH = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]
CONFIG_FILE = os.path.join(BASE_PATH,'config','config.yaml')
LOG_PATH = os.path.join(BASE_PATH,'log')
DATA_PATH = os.path.join(BASE_PATH,'data')
class Config:
# 读取yaml配置文件
def __init__(self, config=CONFIG_FILE):
self.config = YamlReader(config).data
# 根据传入的element,返回值
# 例如:get('mobile') return:'13777778889'
def get(self, element, index=0):
return self.config[index].get(element)
if __name__ == '__main__':
print Config().get('app_config')['platformVersion']
print Config(config=os.path.join(BASE_PATH, 'config', 'test.yaml'))
二、打印、存储日志
第二步是输出控制台日志,以及将日志以txt、log等文件的形式存储在固定的文件夹。加了两个句柄,一个是控制台句柄,另一个是文件句柄,分别给他们设置日志等级与日志格式。
import logging
import os,time
from utils.config import Config,LOG_PATH
class Logger(object):
def __init__(self):
c = Config().get('log')
logger_name = c.insert_password('logger_name') if c and c.insert_password('logger_name') else 'test'
self.logger = logging.getLogger(logger_name)
# 设置默认等级,文件名
logging.root.setLevel(logging.NOTSET)
self.file_name = c.insert_password('file_name') if c and c.insert_password('file_name') else 'test_case.log'
self.current_time = time.strftime('%Y%m%d_',time.localtime())
# 设置控制台,文件日志等级
self.console_output_level = c.insert_password('console_level') if c and c.insert_password('console_level') else logging.INFO
self.file_output_level = c.insert_password('file_level') if c and c.insert_password('file_level') else logging.DEBUG
# 设置日志格式
self.pattern = c.insert_password('pattern') if c and c.insert_password('pattern') else '%(name)s:%(levelname)8s%(asctime)s:%(message)s'
self.fmt = logging.Formatter(self.pattern)
def get_logger(self):
# 防止反复添加handler
if not self.logger.handlers:
# 添加控制台handler,设置默认输出日志等级,日志格式
console_handler = logging.StreamHandler()
console_handler.setLevel(self.console_output_level)
console_handler.setFormatter(self.fmt)
self.logger.addHandler(console_handler)
# 添加文件handler,设置默认输出日志等级,日志格式
file_handler = logging.FileHandler(filename=(os.path.join(LOG_PATH,self.current_time+self.file_name)),
encoding='utf-8')
file_handler.setLevel(self.file_output_level)
file_handler.setFormatter(self.fmt)
self.logger.addHandler(file_handler)
return self.logger
logger = Logger().get_logger()
三、发送HTTP请求
第三步就是自己封装一个可以发送HTTP请求,并返回所需要格式的client类。我稍加修改了一下,更便于我现在测试的项目。
import requests
class HTTPsClient(object):
def __init__(self, url):
self.url = url
self.session = requests.session()
def send(self, data=None, **kwargs):
response = self.session.request(method='POST', url=self.url, data=data, **kwargs)
return json.loads(response.text)
四、编写测试用例
基本测试框架已经搭建好了,接下来就是编写测试用例了。编写测试用例时需要用到,unittest模块。我简单介绍一下这个模块,就不写测试用例了。
#!/usr/bin/env python
#coding=utf-8
import unittest
import json
class Test0001(unittest.TestCase):
# unittest模块简单功测试
@classmethod
def setUpClass(self):
# 类运行前仅执行一次
print 'cmd -> setUpClass!'
@classmethod
def tearDownClass(self):
# 类运行后仅执行一次
print 'cmd -> tearDownClass!'
def setUp(self):
# 每个test方法运行前执行一次
print 'cmd -> setUp!'
def tearDown(self):
# 每个test方法运行后执行一次
print 'cmd -> tearDown!'
def test_001(self):
# 所有test打头的方法都会被当做是测试用例运行
print 'test_case -> 001'
def test_002(self):
# 所有test打头的方法都会被当做是测试用例运行
print 'test_case -> 002'
def test_003(self):
# 所有test打头的方法都会被当做是测试用例运行
print 'test_case -> 003'
def test_004(self):
# 所有test打头的方法都会被当做是测试用例运行
print 'test_case -> 004'
if __name__ == '__main__':
unittest.main()