selenium---POM模式,unittest框架

一.POM模式

POM结构:

项目名称文件:

common文件夹:
base.py文件:对selenium二次封装:
1.打开浏览器
2.打开地址
3.元素定位
4.元素操作

page文件夹:
1.对项目每个页面封装

2.page文件夹:将页面分为三层
表现层:页面中可见的元素
操作层:对可见元素的操作
业务层:由操作层组合形成场景/业务

3.page类:
编写内容:
①封装表现层:制作定位器
②封装操作层:对定位器中各个元素操作,将操作形成方法
③page类继承Base

script文件夹:
存放测试用例,使用unittest管理用例
1.只关注操作步骤,如果涉及到测试数据,暂时写成死数据
2.确定断言
3.关注测试数据灵活性

二.unittest框架

1.作用:
规范自动化测试用例编写
管理自动化测试用例的执行

2.基本概念
测试夹具:test fixture 处理测试前的数据准备和测试后的数据清理
测试套件:test suite 批量收集需要执行的测试用例
测试用例:test case 核心部分,编写的测试用例符合unittest框架的要求
测试执行:test runner 执行测试套件收集的测试用例

3.特殊方法
setUp:在一个py文件,在测试用例执行之前先执行,有多少测试用例,执行多少次
tearDown:在一个py文件中,在测试用例执行之后再执行,有多少测试用例,执行多少次
setUpClass:在一个py文件中,在测试类执行之前先执行,需要@classmethod装饰
tearDownClass:在一个py文件中,在测试类执行之后再执行,需要@classmethod装饰

4.用例编写注意事项
①测试用例文件名称以test开头
②测试用例类名称Tset开头
③测试用例方法名称test开头
④测试用例的执行顺序:对用例名称按照ASCII字符集排序

5.断言
语法:

assertEqual(a,b,msg="当断言失败时输出")
#判断a和b是否相等,如果相等则断言成功,反之断言失败-->用例执行失败
assertTrue(x,msg="当断言失败时输出")
#当条件x为True时.断言成功,反之断言失败-->用例执行失败

断言的添加位置:在测试用例中添加

注意:
断言来说,只有失败的断言才会有提示
断言失败的关键字:AssertionError,表示用例执行失败,不是代码错误

5.测试套件&测试执行
①测试套件:

unittest.defaultTestLoader

②测试执行

unittest.TxetTestRunner

编写步骤:
添加测试用例存放路径
将需要执行的测试用例添加到测试套件中
执行测试用例

6.测试报告
生成html格式的测试报告
操作步骤
①复制HTMLTestRunnerPlugins.py文件到python安装目录中/lib目录下
②导入unittest和HTMLTestRunnerPlugins
③确定测试用例存放路径
④确定测试报告存放路径
⑤命名测试报告的名字,打开预定的测试报告,准备写入内容
⑥将需要执行的测试用例,放入测试套件中
⑦执行测试用例,并生成html格式的测试报告
举例:

# 1.导入unittest和HTMLTestRunnerPlugins
import unittest
import HTMLTestRunnerPlugins
import time
import os
# 2.确定测试用例存放路径
case_dir = "./script"
# 3.确定测试报告存放路径
report_dir = "./report"
# 4.命名测试报告的名,打开预定的测试报告,准备写入内容
# 以当前时间来命名测试报告
now = time.strftime("%Y-%m-%d %H_%M_%S")
report_name = now + "report.html"  # 测试报告名称
with open(os.path.join(report_dir,report_name),"wb") as fp:
# 5.将需要执行的测试用例,放入测试套件中
    discover = unittest.defaultTestLoader.discover(case_dir)
# 6.执行测试用例,并生成html格式的测试报告
    runner = HTMLTestRunnerPlugins.HTMLTestRunner(title="ECShop自动化测试报告",
                                                  description="登录,注册,购物车功能",
                                                  stream=fp,
                                                  verbosity=2)
    runner.run(discover)

7.unittest参数化
①ddt模块实现参数化
②准备测试数据
③在测试类前使用:@ddt.ddt
④在测试用例前使用

@ddt.data(*数据源)
def 测试用例(self,data)
#准备数据为列表嵌套字典格式
@ddt.data(*数据源)
@ddt.unpark
def 测试用例(参数)
#适用于数据源为列表嵌套列表格式

8.文件版数据源

"""
1.读取csv文件/excel表格
2.使用pandas模块读取
3.下载pandas模块
    pip install pandas
    pip install xlrd
"""
import pandas
import os


class OperationData:
    def __init__(self,filename):
        """
        os.path.dirname(__file__)  # 表示当前路径
        os.path.abspath(__file__)   # 表示绝对路径
        os.path.dirname(os.path.dirname(__file__))  #  表示文件所在上级目录
        :param filename: 文件名
        """
        base_path = os.path.dirname(os.path.dirname(__file__)) + "/data"  # 回到项目根目录下,进入data目录
        file_path = os.path.join(base_path,filename)
        if filename.split(".")[-1] == "csv":  # 通过判断文件后缀是否是csv分流
            self.file = pandas.read_csv(file_path)  # 读取csv文件
        else:
            self.file = pandas.read_excel(file_path)  # 读取excel表格

    def get_data_to_dict(self):
        """将数据读取成列表嵌套字典格式[{},{},{}]"""
        # data = []  # 创建一个空列表存放数据
        # for i in self.file.index.values:  # 遍历所有的行
        #     row_data = self.file.loc[i].to_dict()  # 将每一个行的值转化成字典格式
        #     data.append(row_data)
        #
        # return data
        # 列表生成器
        return [self.file.loc[i].to_dict() for i in self.file.index.values]

    def get_data_to_list(self):
        """将数据读取成列表嵌套列表格式[[],[],[]]"""
        return self.file.values.tolist()


if __name__ == '__main__':
    oper = OperationData("userdata.xls")
    # data = oper.get_data_to_dict()
    data = oper.get_data_to_list()
    print(data)



发布了26 篇原创文章 · 获赞 0 · 访问量 289

猜你喜欢

转载自blog.csdn.net/weixin_46009577/article/details/104302831