美文网首页程序员
Sweetest框架学习

Sweetest框架学习

作者: 测试游记 | 来源:发表于2019-01-20 11:20 被阅读38次

1.从Github上获取源代码并用Pycharm打开

项目地址:https://github.com/tonglei100/sweetest.git

将两个sweetest都设置为Sources Root,不然导包处会出现红线

start 设置为Sources Root

2.开始阅读

1.初始化自动化实例

找到start.py,可以发现第24行应该是程序入口

sweet = Autotest(plan_name, sheet_name, desired_caps, server_url)

使用ctrl+鼠标左键跳转至Autotest类

1.1创建日志文件夹的方式

第29行:

#发现Autotest类中使用如下方式创建日志存放文件夹
for p in ('JUnit', 'report', 'snapshot'):
    mkdir(p)
#跳转至mkdir处,此处使用Python标准库之pathlib
from pathlib import Path
def mkdir(p):
    path = Path(p)
    if not path.is_dir():
        path.mkdir()
Python标准库之pathlib

https://www.cnblogs.com/juneman/p/8974505.html

  1. 导入

    • from pathlib import Paht
  2. 初始化

    p = Path()               # 当前目录
    p = Path('a','b','c/d')      # 当前目录下的a/b/c/d(相对路径)
    p = Path('/etc')             # /etc目录(绝对路径)
    
  3. 路径拼接和分解

    • 拼接操作符: /
    • 分解:parts
    # 拼接
    p = Path()
    # p -> PosixPath('.')
    p = p / 'a'
    # p -> PosixPath('a')
    p1 = 'b' / p
    # p1 -> PosixPath('b/a')
    p2 = Path('c')
    p3 = p2/p1
    # p3 -> PosixPath('c/b/a')
    
    # 分解
    p3.parts
    # ('c', 'b', 'a')
    
  4. is_dir() 是否是目录

  5. 创建目录

    path对象的mkdir方法:

    def mkdir(self, mode=0o777, parents=False, exist_ok=False):

    • parents:是否创建父目录,True等同mkdir -p;False时,父目录不存在,则抛出FileNotFoundError

    • exist_ok:在3.5版本加入。False时,路径存在,抛出FileExistsError;True时,FileExistsError被忽略

1.2导入实例化对象

第32行:

g.plan_name = file_name.split('-')[0]

使用ctrl点击g进行跳转至sweetest/sweetest/globals.py

发现导入的是g = Global()的实例化对象g

找到导包的语句from sweetest.globals import g 所以应该是在导入的时候触发的实例化操作

1.3规定内容常量化

第33行-35行,38行:

self.testcase_file = str(Path('testcase') / (file_name + '-' + _testcase + '.xlsx'))

拼接testcase_file文件路径使用_testcase来自

from sweetest.config import _testcase, _elements, _report

# 文件名后缀
_testcase = 'TestCase'  # '测试用例'
_elements = 'Elements'  # '页面元素表'
_report = 'Report'      # '测试结果'

这样就可以规定读取文件/输出报告的格式

1.4 EXCEL操作再次封装

第36,37,39行:

导入语句:from sweetest.utility import Excel

点击Excel跳转,由于现有的Excel操作库分为读取excel信息和将信息写入excel所以定义了class将二者封装在一起

import xlrd
import xlsxwriter

通过def __init__(self, file_name, mode='r'):可以看出,实例化时需要指定操作模式,读取的操作相对简单不进行介绍

写的操作用于报告的输出,所以写的过程中增加了报告通过状态的判断,不同状态有不同的样式例如:

red = self.workbook.add_format({'bg_color': 'red', 'color': 'white'})
if str(data[i][j]) == 'Fail':
    sheet.write(i, j, str(data[i][j]), red)

2.执行自动化测试

start.py中sweet.plan()开始执行测试,点击plan进行跳转

可以发现第70行self.run(sheet_name)正式开始执行用例

2.1使用init函数设置类中属性

使用类似于__init__的函数来修改类中的属性

2.2元素等待/页面刷新超时时间

可以在打开实例化浏览器的时候设置元素等待/页面刷新超时时间

时间可以存放在一个文件中方便后续修改

# 等待元素超时时间
self.driver.implicitly_wait(element_wait_timeout)  # seconds
# 页面刷新超时时间
self.driver.set_page_load_timeout(page_flash_timeout)  # seconds

2.3开始执行用例

第117行ts.run()

进入函数后首先是执行self.testsuite_start()计数器+1并记录开始时间

第136行result = self.setup(testcase, case)进入函数def setup(self, testcase, case):

在函数内部定义了一个函数def run_setup(testcase):函数中

tc = TestCase(testcase)
tc.run()

此处真正开始执行用例

getattr(web, step['keyword'].lower())(step)

sweetest/sweetest/keywords/web.py处可以定义相关页面操作关键字

getattr

getattr(object, name[, default])

  • object -- 对象。
  • name -- 字符串,对象属性。
  • default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。

以open关键字为例,其中值得学习的内容:

2.3.1清理缓存/cookies
if step['data'].get('清理缓存', '') or step['data'].get('cookie', ''):
    g.driver.delete_all_cookies()
初次打开页面

获取当前窗口handle:

handle = g.driver.current_window_handle

注册窗口名称和handle:

self.register(step, handle)

2.3.2打开新窗口后将其加入窗口列表里
#value -> 'https://www.baidu.com/'
js = "window.open('%s')" % value 
g.driver.execute_script(js)
# 判断是否打开了新的窗口,并将新窗口添加到所有窗口列表里
all_handles = g.driver.window_handles
for handle in all_handles:
    if handle not in w.windows.values():
        w.register(step, handle)

register的逻辑:

如果有提供新窗口名字,则使用该名字,否则使用默认名字:HOME

如果存在同名窗口:

1.清除同名旧窗口绑定的页面

2.切换到同名旧窗口去关闭它

3.从窗口资源池 g.windows 里剔除

切回当前窗口,添加到窗口资源池 g.windows,把当前窗口名字改为新窗口名称

(未完待续)

相关文章

网友评论

    本文标题:Sweetest框架学习

    本文链接:https://www.haomeiwen.com/subject/sykxjqtx.html