pytest-架构1

参考:https://www.cnblogs.com/linuxchao/p/linuxchao-pytest-Actual.html

架构结构

config

|-config
|-|-init.py
|-|-conf.py
|-|-config.ini

conf.py

放的是一些配置信息,全局变量,比如根目录在哪儿

使用方法:

config.ini

放的是一些xpath的位置

  1. INI文件的格式很简单,最基本的三个要素是:parameters,sections和comments。
  2. INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value
  3. 所有的parameters都是以sections为单位结合在一起的
  4. 在INI文件中注释语句是以分号“;”开始的

    使用方法:
# 用户名输入框
    username = do_conf.get_locators_or_account('LoginPageElements', 'username')
    # 密码输入框
    password = do_conf.get_locators_or_account('LoginPageElements', 'password')

data

|-data
|-|-init.py
|-|-attachment
|-|-contact_data.py
|-|-login_data.py
|-|-send_mail_data.py
|-|-tcData.xlsx

attachmen

这是发信用的附件

login_data.py

这里存放的是测试数据,比如登录需要什么数据就写在这里
写法上用类的方法
调用方法:
login_data = LoginData
@pytest.mark.parametrize('username, password, expect', login_data.login_success_data)

class LoginData(object):
    """用户登录测试数据"""
    login_success_data = [
        (
            "daido1",
            "daido001",
            "ログアウト"
        )
    ]

    login_fail_data = [
        (
            "daido1",
            "daido11111111",
            " 登录失败"
        ),
        (
            "daido111111111",
            "daido001",
            " 登录失败"
        ),
        (
            "linux",
            "xiaochao",
            " 登录失败"
        )
    ]
![](https://img2020.cnblogs.com/blog/1951341/202009/1951341-20200914142450249-486594020.png)


if __name__ == '__main__':
    pass

tcData.xlsx

Page

BasePage.py

存放一些共通方法

class BasePage(object):
    """结合显示等待封装一些selenium内置方法"""

  def __init__(self, driver, timeout=30):
        self.byDic = {
            'id': By.ID,
            'name': By.NAME,
            'class_name': By.CLASS_NAME,
            'xpath': By.XPATH,
            'link_text': By.LINK_TEXT
        }
        self.driver = driver
        self.outTime = timeout

    def find_element(self, by, locator):
        """
        find alone element
        :param by: eg: id, name, xpath, css.....
        :param locator: id, name, xpath for str
        :return: element object
        """
    def find_elements(self, by, locator):
        """
        find group elements
        :param by: eg: id, name, xpath, css.....
        :param locator: eg: id, name, xpath for str
        :return: elements object
        """
    def is_element_exist(self, by, locator):
        """
        assert element if exist
        :param by: eg: id, name, xpath, css.....
        :param locator: eg: id, name, xpath for str
        :return: if element return True else return false
        """
    def is_alert(self):
        """
        assert alert if exsit
        :return: alert obj
        """
    def switch_to_frame(self, by, locator):
        """判断frame是否存在,存在就跳到frame"""
    def switch_to_default_frame(self):
        """返回默认的frame"""
    def get_alert_text(self):
        """获取alert的提示信息"""
    def get_element_text(self, by, locator, name=None):
        """获取某一个元素的text信息"""
    def load_url(self, url):
        """加载url"""
    def get_source(self):
        """获取页面源码"""
    def send_keys(self, by, locator, value=''):
        """写数据"""
    def clear(self, by, locator):
        """清理数据"""
    def click(self, by, locator):
        """点击某个元素"""
    def sleep(num=0):
        """强制等待"""
    def ctrl_v(self, value):
        """ctrl + V 粘贴"""
    def enter_key():
        """enter 回车键"""

    def wait_element_to_be_located(self, by, locator):
        """显示等待某个元素出现,且可见"""
    def get_page_source(self):
        return self.get_source()

LoginPage.py

存放页面的方法

class LoginPage(BasePage):
    # 配置文件读取元素
    do_conf = ParseConFile()
    # 选择密码登录的按钮
    password_login_btn = do_conf.get_locators_or_account('LoginPageElements', 'password_login_btn')
    # 登录框外的iframe
    frame = do_conf.get_locators_or_account('LoginPageElements', 'frame')

    def login(self, username, password):
        """登录流程"""
        self.open_url()
        self.click_password_login_btn()
        # self.switch_login_frame()
        self.input_username(username)
        self.input_password(password)
        self.click_login_btn()

    def open_url(self):
        return self.load_url('http://daido.sitetest1.com/')
        #return self.load_url('https://mail.126.com')

    def click_password_login_btn(self):
        return self.click(*LoginPage.password_login_btn)

    def switch_login_frame(self):
        return self.switch_to_frame(*LoginPage.frame)

    def clear_username(self):
        return self.clear(*LoginPage.username)

    def input_username(self, username):
        self.clear_username()
        return self.send_keys(*LoginPage.username, username)

    def clear_password(self):
        return self.clear(*LoginPage.password)

    def input_password(self, password):
        self.clear_password()
        return self.send_keys(*LoginPage.password, password)

    def click_login_btn(self):
        return self.click(*LoginPage.loginBtn)

    def switch_default_frame(self):
        return self.switch_to_default_frame()

    def get_error_text(self):
        return self.get_element_text(*LoginPage.error_head)

    def get_login_success_account(self):
        return self.get_element_text(*LoginPage.account)


if __name__ == "__main__":
    pass

util


这里存放的是一些封装好的方法

TestCases

@pytest.mark.loginTest
class TestLogin(object):
    """登录"""
    login_data = LoginData

    @pytest.mark.parametrize('username, password, expect', login_data.login_success_data)
    def test_login(self, open_url, username, password, expect):
        login_page = open_url
        login_page.login(username, password)
        time.sleep(3)
        actual = login_page.get_login_success_account()
        assert expect in actual, "登录成功, 断言失败"
        login_page.switch_default_frame()

    @pytest.mark.parametrize('username, password, expect', login_data.login_fail_data)
    def test_fail(self, open_url, username, password, expect):
        login_page = open_url
        login_page.login(username, password)
        actual = login_page.get_error_text()
        assert actual == expect, "登录失败, 断言失败"


if __name__ == "__main__":
    pytest.main(['-v', 'test_loginCase.py'])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: pytest是Python中一个流行的测试框架,它可以用来编写各种类型的测试,包括单元测试、功能测试和集成测试等。pytest可以自动发现测试用例,并且支持各种标准的断言、测试报告、测试覆盖率和插件机制等功能。pytest还具有简单易用的语法和灵活的插件架构,可以帮助我们更方便地编写和管理测试用例,提高测试效率和质量。 pytest的一些主要特点包括: 1. 支持自动发现测试用例和多种测试用例的组织方式。 2. 提供简单的断言机制,支持丰富的断言方法。 3. 具有丰富的插件,可以扩展pytest的功能。 4. 提供灵活的命令行选项,便于测试的执行和控制。 5. 有良好的文档和社区支持。 总之,pytest是一个易用、灵活和强大的测试框架,可以帮助我们更轻松地编写高质量的测试用例。 ### 回答2: pytest是一个功能强大的Python测试框架,旨在提供简单易用的测试编写和管理工具。它是基于Python标准库中的unittest模块的改进版本,提供了更多的灵活性和便利性。 pytest具有许多特性,使得测试编写更加简洁和可读性更强。首先,pytest支持使用一些简单的命名规则来自动发现测试文件和测试函数。例如,测试文件可以使用test_开头,而测试函数可以使用test_开头,pytest会自动识别并执行这些测试。 其次,pytest提供了强大的断言和丰富的插件系统。它支持大量的断言方式来验证测试结果,并且可以轻松地自定义和扩展断言。此外,pytest还提供了许多插件,如参数化插件(用于为同一个测试函数传入不同的参数)、覆盖率插件(用于衡量代码的覆盖率)等,可以根据具体需求进行选择和使用。 pytest还支持跨平台和跨Python版本的测试,可以在Windows、Linux、Mac等操作系统上运行,并且兼容Python 2.x和Python 3.x版本。此外,pytest还可以与其他测试工具和框架集成,如Selenium、Django、Flask等,可以轻松地进行Web应用测试和UI测试。 总体而言,pytest是一个简单、灵活且功能强大的测试框架,可以帮助开发人员编写高质量的测试代码,并提供丰富的断言和插件来简化测试工作。它的易用性和可扩展性使得它成为Python社区中最受欢迎的测试工具之一。 ### 回答3: pytest是一个功能强大的Python测试框架,它扩展了Python标准库中的unittest模块,使测试编写更简单、可读性更高。pytest的设计理念是简洁而灵活,可以适用于小型项目和大型项目。 pytest具有以下特点: 1. 简洁易用:pytest的语法简洁明了,使用起来非常方便。测试用例不需要继承任何类,不需要使用特定的命名规范,只需使用test_开头即可。另外,pytest还自动发现并执行测试用例,无需手动指定。 2. 丰富的断言功能:pytest内置了丰富的断言函数,可以轻松地进行各种断言操作,例如assertEqual、assertTrue、assertIn等等。如果某个断言失败,pytest会输出详细的错误信息,方便问题排查。 3. 自动化的测试数据生成:pytest支持使用装饰器和参数化来自动生成测试数据,可以避免手动编写大量重复代码,提高测试用例的可维护性。 4. 强大的插件系统:pytest提供了丰富的插件系统,可以根据需要自定义测试流程和行为。例如,可以使用插件来生成测试报告、集成其他工具、扩展断言功能等等。 5. 支持并发执行:pytest支持并发执行测试用例,可以加快测试速度,提高效率。通过-x参数可以指定并发执行的进程数。 总之,pytest是一个简单、灵活、功能强大的Python测试框架,它能够有效地帮助我们编写高质量的测试用例,提高软件质量。无论是个人项目还是大型团队项目,都可以考虑使用pytest进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值