搭建自动化测试框架-面试

首先要介绍 你搭建的框架的总体思想:

config
report
test case
log
data
common_method

其中 common_method 是核心 ,提供了共同的方法 让上边的 东西能协调起来

以下就只介绍这个:

  1. 读取config 的文件内容

class Config:
def init(self, config=CONFIG_FILE):
self.config = YamlReader(config).data

返回config 文件的数据

def get(self, element, index=0):
    """
    yaml是可以通过'---'分节的。用YamlReader读取返回的是一个list,第一项是默认的节,如果有多个节,可以传入index来获取。
    这样我们其实可以把框架相关的配置放在默认节,其他的关于项目的配置放在其他节中。可以在框架中实现多个项目的测试。
    """
    return self.config[index].get(element)

#按照 index 层级 找到 key value

1
2
3
4
5
6
7
8
9
10
11
  1. 抽取json数据,在接口测试经常用到

我们用到一个库是 jmespath ,提供了一个 search 方法 提取json数据,
json 数据转化为dict 的方法是 json.loads(body)

1
2

import json
import jmespath

class JMESPathExtractor(object):
“”"
用JMESPath实现的抽取器,对于json格式数据实现简单方式的抽取。
“”"
def extract(self, query=None, body=None):
try:
return jmespath.search(query, json.loads(body))
except Exception as e:
raise ValueError("Invalid query: " + query + " : " + str(e))

if name == ‘main’:
from utils.client import HTTPClient
res = HTTPClient(url=‘http://wthrcdn.etouch.cn/weather_mini?citykey=101010100’).send()
print(res.text)
# {“data”: {
# “yesterday”: {“date”: “17日星期四”, “high”: “高温 31℃”, “fx”: “东南风”, “low”: “低温 22℃”, “fl”: “<![CDATA[<3级]]>”,
# “type”: “多云”},
# “city”: “北京”,
# “aqi”: “91”,
# “forecast”: [
# {“date”: “18日星期五”, “high”: “高温 28℃”, “fengli”: “<![CDATA[<3级]]>”, “low”: “低温 22℃”, “fengxiang”: “东北风”,
# “type”: “多云”},
# {“date”: “19日星期六”, “high”: “高温 29℃”, “fengli”: “<![CDATA[<3级]]>”, “low”: “低温 22℃”, “fengxiang”: “东风”,
# “type”: “雷阵雨”},
# {“date”: “20日星期天”, “high”: “高温 29℃”, “fengli”: “<![CDATA[<3级]]>”, “low”: “低温 23℃”, “fengxiang”: “东南风”,
# “type”: “阴”},
# {“date”: “21日星期一”, “high”: “高温 30℃”, “fengli”: “<![CDATA[<3级]]>”, “low”: “低温 24℃”, “fengxiang”: “西南风”,
# “type”: “晴”},
# {“date”: “22日星期二”, “high”: “高温 29℃”, “fengli”: “<![CDATA[<3级]]>”, “low”: “低温 24℃”, “fengxiang”: “北风”,
# “type”: “雷阵雨”}
# ],
# “ganmao”: “各项气象条件适宜,无明显降温过程,发生感冒机率较低。”, “wendu”: “25”
# },
# “status”: 1000,
# “desc”: “OK”}

j = JMESPathExtractor()
j_1 = j.extract(query='data.forecast[1].date', body=res.text)
j_2 = j.extract(query='data.ganmao', body=res.text)
print(j_1, j_2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  1. 数据驱动 读取excel 数据, 进行参数化 (参考我写的数据驱动的内容)
  2. 自动生成随便数据

在接口测试时候为了造数据而造数据是很麻烦,不小心就重复了, 为了 解决这个问题 封装一些方法。

1)当我们想随机抽一个在自己提供的一个list, 可以这样封装 :

1

def factory_choice_generator(values):
“”" 返回一个生成器函数,调用这个函数产生生成器,从给定的list中随机取一项。 “”"
def choice_generator():
my_list = list(values)
# rand = random.Random()
while True:
yield random.choice(my_list)
#随机选择一个
return choice_generator

1
2
3
4
5
6
7
8
9

2)当我们想要个随机的字符串, 可以这么写,

def random_str(min_chars=0, max_chars=8):
“”“长度在最大值与最小值之间的随机字符串”""
return fake.pystr(min_chars=min_chars, max_chars=max_chars)

1
2
3

3)当我们想要个随机的手机号, 地址, email 都可以用 fake 库来实现 ,

import random
from faker import Factory

fake = Factory().create(‘zh_CN’)

def random_phone_number():
“”“随机手机号”""
return fake.phone_number()

def random_name():
“”“随机姓名”""
return fake.name()

def random_address():
“”“随机地址”""
return fake.address()

def random_email():
“”“随机email”""
return fake.email()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  1. 封装 log 方法 ,用于 提取我们的log内容,放到专门的log文件

用到了logging 库 和 from logging.handlers import TimedRotatingFileHandler

1

代码如下:

import os
import logging
from logging.handlers import TimedRotatingFileHandler
from utils.config import LOG_PATH

class Logger(object):
def init(self, logger_name=‘framework’):
self.logger = logging.getLogger(logger_name)
logging.root.setLevel(logging.NOTSET)
self.log_file_name = ‘test.log’
self.backup_count = 5
# 日志输出级别
self.console_output_level = ‘WARNING’
self.file_output_level = ‘DEBUG’
# 日志输出格式
self.formatter = logging.Formatter(’%(asctime)s - %(name)s - %(levelname)s - %(message)s’)

def get_logger(self):
    """在logger中添加日志句柄并返回,如果logger已有句柄,则直接返回"""
    if not self.logger.handlers:  # 避免重复日志
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(self.formatter)
        console_handler.setLevel(self.console_output_level)
        self.logger.addHandler(console_handler)

        # 每天重新创建一个日志文件,最多保留backup_count份
        file_handler = TimedRotatingFileHandler(filename=os.path.join(LOG_PATH, self.log_file_name),
                                                when='D',
                                                interval=1,
                                                backupCount=self.backup_count,
                                                delay=True,
                                                encoding='utf-8'
                                                )
        file_handler.setFormatter(self.formatter)
        file_handler.setLevel(self.file_output_level)
        self.logger.addHandler(file_handler)
    return self.logger

logger = Logger().get_logger()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  1. report

    report = REPORT_PATH + ‘\测试报告.html’

    test_suite = unittest.defaultTestLoader.discover(’.’, pattern=‘test*.py’)
    result = BeautifulReport(test_suite)
    result.report(filename=‘测试报告’, description=‘测试deafult报告’, log_path=REPORT_PATH)

    1
    2
    3
    4
    5

————————————————
版权声明:本文为优快云博主「上海_彭彭」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_34979346/article/details/90730118

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值