自動化テストフレームワーク構築_面接問題
面接では自動化フレームワークの構築の質問に答えるかもしれませんが、できると言ったとき、答えられないと気まずいかもしれません.
まず、あなたが構築した枠組みの全体的な考えを紹介します. config report test case log data common_method
ここでcommon_methodはコアで、上のものを調和させる共通の方法を提供しています
以下ではこれだけを紹介します.
1.configのファイル内容を読み込む
2.jsonデータを抽出し、インタフェーステストでよく使う
3.データドライバexcelデータを読み出し、パラメータ化する(私が書いたデータドライバの内容を参照)
4.ランダムデータの自動生成
インタフェーステストでデータを作るためにデータを作るのは面倒で、うっかり繰り返してしまい、この問題を解決するためにいくつかの方法をカプセル化します.
2)ランダムな文字列が欲しい場合は、このように書くことができます.
3)ランダムな携帯番号、住所、emailをfakeライブラリで実現したい場合は、
5.logメソッドをカプセル化し、私たちのlogコンテンツを抽出し、専門のlogファイルに置く
コードは次のとおりです.
6. report
まず、あなたが構築した枠組みの全体的な考えを紹介します.
ここで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
2.jsonデータを抽出し、インタフェーステストでよく使う
jmespath , search json ,
json dict json.loads(body)
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": "",
# "type": " "},
# "city": " ",
# "aqi": "91",
# "forecast": [
# {"date": "18 ", "high": " 28℃", "fengli": "", "low": " 22℃", "fengxiang": " ",
# "type": " "},
# {"date": "19 ", "high": " 29℃", "fengli": "", "low": " 22℃", "fengxiang": " ",
# "type": " "},
# {"date": "20 ", "high": " 29℃", "fengli": "", "low": " 23℃", "fengxiang": " ",
# "type": " "},
# {"date": "21 ", "high": " 30℃", "fengli": "", "low": " 24℃", "fengxiang": " ",
# "type": " "},
# {"date": "22 ", "high": " 29℃", "fengli": "", "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)
3.データドライバexcelデータを読み出し、パラメータ化する(私が書いたデータドライバの内容を参照)
4.ランダムデータの自動生成
インタフェーステストでデータを作るためにデータを作るのは面倒で、うっかり繰り返してしまい、この問題を解決するためにいくつかの方法をカプセル化します.
1) list, :
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
2)ランダムな文字列が欲しい場合は、このように書くことができます.
def random_str(min_chars=0, max_chars=8):
""" """
return fake.pystr(min_chars=min_chars, max_chars=max_chars)
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()
5.logメソッドをカプセル化し、私たちのlogコンテンツを抽出し、専門のlogファイルに置く
logging from logging.handlers import TimedRotatingFileHandler
コードは次のとおりです.
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()
6. 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)