目录:导读
前言
1、测试框架简介
1)测试框架的优点
代码复用率高,如果不使用框架的话,代码会显得很冗余。
可以组装日志、报告、邮件等一些高级功能。
提高元素等数据的可维护性,元素发生变化时,只需要更新一下配置文件。
使用更灵活的PageObject设计模式。
2)测试框架的整体目录
目录/文件 | 说明 | 是否为python包 |
---|---|---|
common | 这个包中存放的是常见的通用的类,如读取配置文件 | 是 |
config | 配置文件目录 | 是 |
logs | 日志目录 | |
page | 对selenium的方放进行深度的封装 | 是 |
page_element | 页面元素存放目录 | |
page_object | 页面对象POM设计模式,本人对这个的理解来自于苦叶子的博客 | 是 |
TestCase | 所有的测试用例集 | 是 |
utils | 工具类 | 是 |
script | 脚本文件 | |
conftest.py | pytest胶水文件 | |
pytest.ini | pytest配置文件 |
【注意】 init.py 文件用以标识此目录为一个python包。
2、首先时间管理
首先,因为很多的模块都会用到当前时间的时间戳,或者日期等等字符串,所以先单独把时间操作(我们需要获取的不同格式的时间信息)封装成一个模块。
然后让其他模块来调用即可。在 utils 目录新建 times.py 模块。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import time
import datetime
from functools import wraps
def timestamp():
"""时间戳"""
return time.time()
def dt_strftime(fmt="%Y%m"):
"""
datetime格式化时间
:param fmt "%Y%m%d %H%M%S
"""
return datetime.datetime.now().strftime(fmt)
def sleep(seconds=1.0):
"""
睡眠时间
"""
time.sleep(seconds)
def running_time(func):
"""函数运行时间"""
@wraps(func)
def wrapper(*args, **kwargs):
start = timestamp()
res = func(*args, **kwargs)
print("校验元素done!用时%.3f秒!" % (timestamp() - start))
return res
return wrapper
if __name__ == '__main__':
print(dt_strftime("%Y%m%d%H%M%S"))
3、添加配置文件
1)conf.py
UI自动化测试框架中应该有一个文件对整体的目录进行管理;
在项目中的 config 目录创建 conf.py 文件,所有的目录配置信息写在这个文件里面。
import os
from selenium.webdriver.common.by import By
from utils.times import dt_strftime
class ConfigManager(object):
# 项目目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 页面元素目录
ELEMENT_PATH = os.path.join(BASE_DIR, 'page_element')
# 报告文件
REPORT_FILE = os.path.join(BASE_DIR, 'report.html')
# 元素定位的类型
LOCATE_MODE = {
'css': By.CSS_SELECTOR,
'xpath': By.XPATH,
'name': By.NAME,
'id': By.ID,
'class': By.CLASS_NAME
}
# 邮件信息
EMAIL_INFO = {
'username': 'xxxxxxx@qq.com', # 切换成你自己的地址
'password': 'QQ邮箱授权码',
'smtp_host': 'smtp.qq.com',
'smtp_port': 465
}
# 收件人
ADDRESSEE = [
'xxxxxxxx@qq.com',
]
@property
def log_file(self):
"""日志目录"""
log_dir = os.path.join(self.BASE_DIR, 'logs')
if not os.path.exists(log_dir):
os.makedirs(log_dir)
return os.path.join(log_dir, '{}.log'.format(dt_strftime()))
@property
def ini_file(self):
"""配置文件"""
ini_file = os.path.join(self.BASE_DIR, 'config', 'config.ini')
if not os.path.exists(ini_file):
raise FileNotFoundError("配置文件%s不存在!" % ini_file)
return ini_file
cm = ConfigManager()
if __name__ == '__main__':
print(cm.BASE_DIR)
【注意】:QQ邮箱授权码:点击查看生成教程
2)config.ini
在项目 config 目录新建一个 config.ini 文件,里面暂时先放入需要测试的URL。
[HOST]
HOST = https://www.baidu.com
3)读取配置文件
①配置文件创建好了,接下来我们需要读取这个配置文件以使用里面的信息。
②使用python内置的 configparser 模块对 config.ini 文件信息进行了读取。
③对于测试url值的提取,使用python高阶语法 @property 属性值,写法更简单。
④在 common 目录中新建一个 readconfig.py 文件。
import configparser
from config.conf import cm
HOST = 'HOST'
class ReadConfig(object