什么是pytest,什么是fixture

时间:2025-11-01 20:10:03  阅读量:  分类:标签:


#同步案例,同时运行两个playwright实例-但是在同步的时候,playwright只让同时运行一个,所以要关系一个实例,才能继续运行下一个.

from playwright.sync_api import Page,sync_playwright

def test_baidu():
    #pw层,引入一个playwright的一个实例,开启playwright
    with sync_playwright()as pw:
        #浏览器层,创建一个谷歌浏览器,设置无头
        browser=pw.chromium.launch(headless=False)
        #然后在设置上下文.浏览器的大小,分辨率等等.
        context=browser.new_context()
        #page层,定位,打开网址等等操作.
        page=context.new_page()
        page.goto(url="https://www.baidu.com")
        page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
        page.locator('//button[@id="chat-submit-button"]').click()
        page.wait_for_timeout(2000)


def test_baidua():
    #pw层,引入一个playwright的一个实例,开启playwright
    with sync_playwright()as pw:
        #浏览器层,创建一个谷歌浏览器,设置无头
        browser=pw.chromium.launch(headless=False)
        #然后在设置上下文.浏览器的大小,分辨率等等.
        context=browser.new_context()
        #page层,定位,打开网址等等操作.
        page=context.new_page()
        page.goto(url="https://www.baidu.com")
        page.locator('//textarea[@id="chat-textarea"]').fill("myname is pw2")
        page.locator('//button[@id="chat-submit-button"]').click()
        page.wait_for_timeout(3000)



#因为函数是test开头,所以可以直接运行,函数无需调用就可以运行.
#但是:虽然两个函数都是以test_开头,但可能没有使用测试框架来运行,而是直接运行Python脚本。在直接运行Python脚本的情况下,即使函数以test_开头,也不会自动执行,除非显式调用它们。,所以只会执行你当前选中的函数.
#一共有两种方式运行,
#1\直接点击运行按钮,或者在你想要运行的函数哪里点击测试.
#2\用命令行去运行:

#2\用命令行就可以使用pytest提供了几个大功能,直接点击按钮就没有这个效果,最重要的就是这三个功能
#---另外按钮和测试按钮运行只能执行一个函数,如果两个函数想同时执行,要么调用(引用)函数,在按钮执行,要么就命令行执行.(建议命令行.)
#1\测试用例的发现,他会看到以test开头他会认为是用例,他就需要去跑.
#2\测试用例的执行,以test开头,无需调用函数,他会自己帮你执行这个函数.
#3\运行完成以后,会生成一个简易的报告.

#报告查看方法:
#终端输入:pytest play.py(当前文件名)-回车,就开始跑了,跑完以后,会在终端生成一个报告.



''' 必须通过命令行运行pytest才能看到报告. 报告内容:
Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。

安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows

(.venv) PS E:\playwright> pytest play.py   #test session starts已经开始了.
=================================================== test session starts =============
#执行的平台是win32  执行的python版本是多少,和pytest的版本是多少,和其他插件的版本是多少.
platform win32 -- Python 3.13.5, pytest-8.4.2, pluggy-1.6.0
#告诉你当前项目的跟域名是神马.
baseurl: http://www.自动化测试.com
#我们项目的文件位置根目录在哪里,
rootdir: E:\playwright
#他的configfile文件是哪一个.
configfile: pytest.ini
#对应其他插件,base-url的版本,和playwright的版本
plugins: base-url-2.1.0, playwright-0.7.1
#以及一共有多少个测试用例.
collected 2 items                                                                                                          
#然后开始跑用例
play.py ..           [100%]
        #告诉我们两条用例全部通过.用时, 10.16s 秒
============================ 2 passed in 10.16s =========
(.venv) PS E:\playwright> 
'''

用命令行只执行一个函数(命令默认是同时执行两个函数),不一下子执行两个.

#需要导入pytest:   import pytest ,同时需要在你要执行的函数前面加上:@pytest.mark.only

#同步案例,同时运行两个playwright实例-但是在同步的时候,playwright只让同时运行一个,所以要关系一个实例,才能继续运行下一个.

from playwright.sync_api import Page,sync_playwright
import pytest   #这个功能需要单独把pytest引入

@pytest.mark.only            #同时要在你运行的函数前面加上@pytest.mark.only
def test_baidu():
    #pw层,引入一个playwright的一个实例,开启playwright
    with sync_playwright()as pw:
        #浏览器层,创建一个谷歌浏览器,设置无头
        browser=pw.chromium.launch(headless=False)
        #然后在设置上下文.浏览器的大小,分辨率等等.
        context=browser.new_context()
        #page层,定位,打开网址等等操作.
        page=context.new_page()
        page.goto(url="https://www.baidu.com")
        page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
        page.locator('//button[@id="chat-submit-button"]').click()
        page.wait_for_timeout(2000)


def test_baidua():
    #pw层,引入一个playwright的一个实例,开启playwright
    with sync_playwright()as pw:
        #浏览器层,创建一个谷歌浏览器,设置无头
        browser=pw.chromium.launch(headless=False)
        #然后在设置上下文.浏览器的大小,分辨率等等.
        context=browser.new_context()
        #page层,定位,打开网址等等操作.
        page=context.new_page()
        page.goto(url="https://www.baidu.com")
        page.locator('//textarea[@id="chat-textarea"]').fill("myname is pw2")
        page.locator('//button[@id="chat-submit-button"]').click()
        page.wait_for_timeout(3000)


#然后执行的命令也要改成:pytest -m only play.py


什么是fixture:看不懂的话直接看红色文字.

我们平常在函数中可以直接调用的page参数,为什么调用括号里的page参数,就可以直接运行并且使用呢?

因为我的page是从插件里面来的,page参数已经定义好了,我们找到左侧文件夹.venv>lib>site-packages>pytest_playwright.py

点开文件,我们在文件中搜一下,def page 我们就可以看到page参数对应的函数模块.

我们可以看到函数上方有一个@pytest.fixture

这个就是pytest的fixture,就是一个夹具,夹具里面就可以默认去给你返回一个page页,

这个page页,由我们的上下文去创建了一个con.text.new_page()这种方式去创建的,所以参数里面就可以直接用page了.

这里的context,上下文也是由另一个函数创建的,

如果听不懂,我们自己创建一个fixture来用,


我们在自己的案例文件中,创建一个我们自己的fixture,fixture后面的括号可以加上,也可以去掉.

代码如下

from playwright.sync_api import Page,expect
import pytest

@pytest.fixture  #创建一个fixture定义一个自己的夹具
def hello_world():
    print("hello world")
    

    
@pytest.mark.only
def test_baidu(page:Page,hello_world):
    page.goto(url="https://www.baidu.com")
    #page.wait_for_timeout(5000)
    page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
    page.locator('//button[@id="chat-submit-button"]').click()
    page.wait_for_timeout(10000)

我们发现,除了打开浏览器以外,同时还执行了打印helloworld,这样我们就成功的运行了fixture


如果我们想在程序一开始的时候输入hello,在打开浏览器程序结束以后,输入world怎么操作呢?

我们可以使用yield,然后在使用print,详见代码

from playwright.sync_api import Page, expect
import pytest


@pytest.fixture  # 创建一个fixture定义一个自己的夹具
def hello_world():
    print("hello")
    yield
    print("\nworld")


@pytest.mark.only
def test_baidu(page: Page, hello_world):
    page.goto(url="https://www.baidu.com")
    # page.wait_for_timeout(5000)
    page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
    page.locator('//button[@id="chat-submit-button"]').click()
    page.wait_for_timeout(10000)