使用python+pytest+po模式如何写一个完整的自动化测试框架?
时间: 2023-12-13 21:02:46 浏览: 109
基于python的自动化测试框架
5星 · 资源好评率100%
好的,我会尽力回答你的问题。
首先,需要了解什么是 pytest 和 Page Object 模式。
pytest 是一个基于 Python 的测试框架,它支持参数化测试、测试固件、插件化等功能,可以帮助我们编写高效、可维护的测试脚本。
Page Object 模式是一种设计模式,它将页面的操作和页面元素的定位分离开来,使得测试脚本更加简洁、易于维护。
接下来,我们可以按照以下步骤来编写完整的自动化测试框架:
1. 安装 pytest 和 selenium 库
使用以下命令安装:
```
pip install pytest selenium
```
2. 创建测试用例
在项目中创建一个 test 目录,然后在该目录下创建一个 test_example.py 文件,编写测试用例。
例如:
```python
import pytest
from pages.login_page import LoginPage
@pytest.mark.usefixtures("setup")
class TestLogin:
def test_valid_login(self):
login_page = LoginPage(self.driver)
login_page.login("username", "password")
assert "Welcome" in login_page.get_title()
def test_invalid_login(self):
login_page = LoginPage(self.driver)
login_page.login("invalid_username", "invalid_password")
assert "Invalid username or password" in login_page.get_error_message()
```
在上面的示例中,我们使用了 pytest 的装饰器 @pytest.mark.usefixtures("setup"),它用于指定测试用例执行前的前置条件。
我们还使用了 Page Object 模式,将登录页面的操作封装在了 LoginPage 类中。
3. 创建页面对象
在项目中创建一个 pages 目录,然后在该目录下创建一个 login_page.py 文件,编写 LoginPage 类。
例如:
```python
from selenium.webdriver.common.by import By
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_input = (By.ID, "username")
self.password_input = (By.ID, "password")
self.login_button = (By.ID, "login_button")
self.error_message = (By.ID, "error_message")
def login(self, username, password):
self.driver.find_element(*self.username_input).send_keys(username)
self.driver.find_element(*self.password_input).send_keys(password)
self.driver.find_element(*self.login_button).click()
def get_title(self):
return self.driver.title
def get_error_message(self):
return self.driver.find_element(*self.error_message).text
```
在上面的示例中,我们使用了 Selenium 的 By 模块来定位页面元素,将页面元素的定位与操作分离开来,使得测试脚本更加简洁、易于维护。
4. 创建 conftest.py 文件
在项目根目录下创建一个 conftest.py 文件,用于定义测试固件。
例如:
```python
import pytest
from selenium import webdriver
@pytest.fixture(scope="session")
def setup(request):
driver = webdriver.Chrome()
driver.maximize_window()
request.cls.driver = driver
yield
driver.quit()
```
在上面的示例中,我们使用了 pytest 的装饰器 @pytest.fixture,它用于定义测试固件。在该示例中,我们定义了一个名为 setup 的测试固件,它会在测试用例执行前启动 Chrome 浏览器,并将 driver 对象传递给测试用例。
5. 运行测试用例
在项目根目录下打开终端,运行以下命令:
```
pytest test/
```
其中,test/ 表示测试用例所在的目录。
完成上述步骤后,我们就可以编写一个完整的自动化测试框架了。当然,这只是一个简单的示例,实际应用中还需要考虑更多的因素,比如测试报告生成、异常处理、数据驱动等。
阅读全文