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'])
【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档围绕“博士论文复现”主题,重点介绍了光伏并网逆变器的阻抗建模与扫频法稳定性分析,涵盖锁相环和电流环的Simulink仿真实现。文档旨在通过完整的仿真资源和代码帮助科研人员复现相关技术细节,提升对新能源并网系统动态特性和稳定机制的理解。此外,文档还提供了大量其他科研方向的复现资源,包括微电网优化、机器学习、路径规划、信号处理、电力系统分析等,配套MATLAB/Simulink代码与模型,服务于多领域科研需求。; 适合人群:具备一定电力电子、自动控制或新能源背景的研究生、博士生及科研人员,熟悉MATLAB/Simulink环境,有志于复现高水平论文成果并开展创新研究。; 使用场景及目标:①复现光伏并网逆变器的阻抗建模与扫频分析过程,掌握其稳定性判据与仿真方法;②借鉴提供的丰富案例资源,支撑博士论文或期刊论文的仿真实验部分;③结合团队提供的算法与模型,快速搭建实验平台,提升科研效率。; 阅读建议:建议按文档目录顺序浏览,优先下载并运行配套仿真文件,结合理论学习与代码调试加深理解;重点关注锁相环与电流环的建模细节,同时可拓展学习其他复现案例以拓宽研究视野。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值