千锋教育-做有情怀、有良心、有品质的职业教育机构

class TestUser:
def setup_method(self):
self.db = connect_db()
self.token = login("admin", "123456")
self.user_data = create_test_user()
def test_create_user(self):
# 测试逻辑
pass
def teardown_method(self):
self.db.close()
delete_test_user(self.user_data)
import pytest
@pytest.fixture
def db_connection():
conn = connect_db()
yield conn
conn.close()
@pytest.fixture
def admin_token(db_connection):
return login("admin", "123456")
@pytest.fixture
def test_user(db_connection):
user = create_test_user()
yield user
delete_test_user(user)
def test_create_user(test_user, admin_token):
# 测试逻辑:直接使用 test_user 和 admin_token
pass
@pytest.fixture
def api_client(admin_token):
return APIClient(base_url="https://api.example.com", token=admin_token)
@pytest.fixture
def user_service(api_client):
return UserService(api_client)
def test_get_user(user_service):
# Pytest 自动解析链路:
# test_get_user → user_service → api_client → admin_token
user = user_service.get_user(1)
assert user.name == "张三"
@pytest.fixture(scope="session")
def test_server():
server = start_test_server()
yield server
server.stop()
@pytest.fixture(scope="function")
def fresh_db(test_server):
db = test_server.create_database()
yield db
db.drop()
tests/
├── conftest.py # 全局 Fixture:数据库、登录、配置
├── api/
│ ├── conftest.py # API 测试专属 Fixture
│ ├── test_user.py
│ └── test_order.py
├── ui/
│ ├── conftest.py # UI 测试专属 Fixture
│ └── test_login.py
└── conftest.py # 根级,所有子目录都继承
# tests/conftest.py(全局)
@pytest.fixture
def base_url():
return "https://api.test.example.com"
@pytest.fixture
def auth_headers(base_url):
response = requests.post(f"{base_url}/auth/login", json={
"username": "test_admin",
"password": "test_pass"
})
token = response.json()["token"]
return {"Authorization": f"Bearer {token}"}
# tests/api/test_user.py(无需 import,直接用)
def test_list_users(auth_headers, base_url):
resp = requests.get(f"{base_url}/users", headers=auth_headers)
assert resp.status_code == 200
@pytest.fixture(params=[
{"username": "admin", "password": "admin123", "expected": True},
{"username": "guest", "password": "wrong", "expected": False},
{"username": "", "password": "", "expected": False},
])
def login_case(request):
return request.param
def test_login(login_case):
result = login(login_case["username"], login_case["password"])
assert result.success == login_case["expected"]
test_login[login_case0] ✅ PASSED
test_login[login_case1] ✅ PASSED
test_login[login_case2] ✅ PASSED
@pytest.fixture(params=["chrome", "firefox", "edge"])
def browser(request):
if request.param == "chrome":
driver = webdriver.Chrome()
elif request.param == "firefox":
driver = webdriver.Firefox()
else:
driver = webdriver.Edge()
yield driver
driver.quit()
def test_search(browser):
browser.get("https://www.baidu.com")
browser.find_element(By.ID, "kw").send_keys("Pytest")
results = browser.find_elements(By.CSS_SELECTOR, ".result")
assert len(results) > 0
# 问题代码:隐式依赖,职责不清
@pytest.fixture
def app():
db = create_db()
user = create_user(db)
token = login(db, user)
client = APIClient(token)
cache = RedisCache()
yield {"client": client, "db": db, "user": user, "token": token, "cache": cache}
cleanup_everything(db, user, cache)
# 拆分为独立 Fixture,职责单一
@pytest.fixture(scope="session")
def database():
db = create_db()
yield db
db.close()
@pytest.fixture
def test_user(database):
user = create_user(database)
yield user
database.delete_user(user.id)
@pytest.fixture
def auth_token(database, test_user):
return generate_token(test_user)
@pytest.fixture
def api_client(auth_token):
return APIClient(token=auth_token)
# 测试用例只声明自己需要的
def test_user_profile(api_client, test_user):
resp = api_client.get(f"/users/{test_user.id}")
assert resp.status_code == 200
上一篇
软件测试有哪些方法和技术
相关推荐