• markdown 组件的问题,双引号和文本内容太密了


    你可以按照这种格式写会好点

    <blockquote><br>
    <p>你可以按照这种格式写会好点</p>
    </blockquote>
    
  • text

  • 灰度验证

  • # demo.py
    import pytest
    
    
    class TestCase:
        def testcase1(self,results):
            print("+++ case 1")
            print("【+】" + results['key'].nodeid)
    
    
        # def testcase2(self):
        #   print("+++ case 2")
    
    
    if __name__ == '__main__':
        pytest.main(['demo.py','-v','-s'])
    
    
    import pytest
    
    
    makereport = {}
    
    @pytest.hookimpl(hookwrapper=True, tryfirst=True)
    def pytest_runtest_makereport(item, call):
        print('------------------------------------')
    
        # 2. 获取钩子方法的调用结果
        result = yield
    
        # 3. 从钩子方法的调用结果中获取测试报告
        report = result.get_result()
    
        makereport['key']=report
    
        print('从结果中获取测试报告:', report)
        print('从报告中获取 nodeid:', report.nodeid)
        print('从报告中获取调用步骤:', report.when)
        print('从报告中获取执行结果:', report.outcome)
    
    
    @pytest.fixture(scope="session")
    def results():
        yield makereport
    
  • 你要解决问题的思路是,为什么其中 page 容易继承和初始化 driver 驱动,导致测试时会同时打开多个浏览器页面。

    显然是你的传参有问题。不是每一步都创建 driver,创建 driver 只调用一次,包括了打开浏览器、关闭浏览器,配合 yeild,放在 conftest 里面,在 setUp 和 tearDown 分别调用。

    盲猜,你的 PO 模式的,page 模块的 driver 不是入参。每个模块都会重复创建。 我写个伪代码吧,帮你提供思路,仅供参考:

    你的 conftest 配置:

    # ./conftest.py
    import  pytest
    import ... ...
    
    @pytest.fixture(scope='function')
    def   operatorSeleniumDriver():
            driver = 创建dirver
            driver.打开浏览器
            yield  driver 
            driver.关闭浏览器
    
    
    

    你的 page 模块的封装:

    #./Page/ Login.py
    
    class LoginStep:
    
      def 选择登录的方式(self,driver):
           driver.find_element(xxxxxxx)
           pass
    
      def 输入用户名密码登陆(self,driver):
           driver.find_element(xxxxxxx)
           pass
    
    
    

    你的测试用例这样写:

    # ./TestCase/test_login.py
    import   Page.xxx.Login
    
    class Test_login:
    
        def  test_login(operatorSeleniumDriver)
        driver = operatorSeleniumDriver
        action = LoginStep()
        action.选择登录的方式(driver)
        action.输入用户名密码登陆(driver)
        ......
    
    
    
  • 虽然不会改动原来脚本,但我感觉你大部分工作要维护 field_change 函数了

  • 没有内容 at 2023年07月19日
    仅楼主可见
  • 首先你这个逻辑就是错的,夹具函数本身只返回一个值或者不返回,即使是加入 yield,也不能实现分批次返回。“When using yield the code block after the yield statement is executed as teardown code regardless of the test outcome, and must yield exactly once.”

    所以,你要把夹具函数当成@pytest.mark.parametrize用?夹具函数本身就不具备参数化的能力,重新设计你的脚本逻辑,再深刻点理解一下夹具函数的定义

    Decorator to mark a fixture factory function.
    This decorator can be used, with or without parameters, to define a fixture function.
    The name of the fixture function can later be referenced to cause its invocation ahead of running tests: test modules or classes can use the pytest.mark.usefixtures(fixturename) marker.
    Test functions can directly use fixture names as input arguments in which case the fixture instance returned from the fixture function will be injected.
    Fixtures can provide their values to test functions using return or yield statements. When using yield the code block after the yield statement is executed as teardown code regardless of the test outcome, and must yield exactly once.

  • 888 积分已送达 at 2022年05月17日

    赞一个

  • 必须到现场吗?