杰瑞科技汇

Python断言assertText如何正确使用?

assert 语句

assert 是 Python 的一个关键字,用于进行调试和内部一致性检查,它的基本语法是:

Python断言assertText如何正确使用?-图1
(图片来源网络,侵删)
assert condition, "Optional error message"
  • condition:一个必须为 True 的布尔表达式。
  • "Optional error message"conditionFalseAssertionError 异常被抛出时,这个可选的字符串会作为错误信息显示出来。

conditionTrue,程序会继续执行,什么也不会发生,如果为 False,程序会立即停止,并抛出 AssertionError


使用 assert 进行简单的文本断言

虽然 assert 主要用于代码逻辑验证,但它也可以用来检查字符串内容,我们来看几个例子。

示例 1:检查字符串是否包含子串

这是最常见的文本断言场景,我们可以使用 in 操作符。

def process_user_data(user_profile):
    # 假设这是一个处理用户资料的函数
    processed_data = f"User: {user_profile['name']}, Role: {user_profile['role']}"
    # 断言处理后的数据必须包含 "User:" 和用户的角色
    assert "User:" in processed_data, f"Processed data is malformed: {processed_data}"
    assert user_profile['role'] in processed_data, f"User role '{user_profile['role']}' not found in data."
# 测试用例 1: 成功的情况
user1 = {'name': 'Alice', 'role': 'Admin'}
process_user_data(user1)
print("Test 1 passed!")
# 测试用例 2: 失败的情况
user2 = {'name': 'Bob', 'role': 'Editor'}
try:
    process_user_data(user2) # 这个断言会失败
except AssertionError as e:
    print(f"Test 2 failed as expected: {e}")

输出:

Python断言assertText如何正确使用?-图2
(图片来源网络,侵删)
Test 1 passed!
Test 2 failed as expected: User role 'Editor' not found in data.

示例 2:检查字符串是否完全匹配

使用 操作符来检查两个字符串是否完全一样。

expected_greeting = "Hello, World!"
actual_greeting = "Hello, World!" # 假设这是从某个函数获取的值
assert actual_greeting == expected_greeting, f"Greeting mismatch. Expected: '{expected_greeting}', Got: '{actual_greeting}'"
print("Greeting assertion passed!")

actual_greeting 变成了 "hello, world!",断言就会失败,因为 Python 的字符串比较是区分大小写的。

示例 3:检查字符串的开头或结尾

使用字符串的 .startswith().endswith() 方法。

filename = "report_2025-10-27.csv"
assert filename.startswith("report_"), "Filename does not start with 'report_'"
assert filename.endswith(".csv"), "Filename does not have a .csv extension"
print("Filename assertion passed!")

assert 在自动化测试中的局限性(重要!)

在像 SeleniumPlaywright 这样的 Web 自动化测试框架中,强烈不推荐直接使用 assert,原因如下:

Python断言assertText如何正确使用?-图3
(图片来源网络,侵删)
  1. 不够健壮:Web 页面元素加载需要时间,直接 assert 可能会因为元素还没加载出来而立即失败,即使几秒钟后它就会出现。
  2. 错误信息不友好:当断言失败时,assert 只会抛出一个 AssertionError,你很难直接知道是哪个元素、哪个属性出了问题,你需要手动去调试。
  3. 缺乏等待机制assert 本身不包含任何等待逻辑,测试框架提供的断言方法(如 Selenium 的 assert)通常与显式等待(WebDriverWait)结合使用,更加稳定。

自动化测试中的“断言文本”最佳实践

在自动化测试中,我们通常使用测试框架(如 pytest)或库(如 Selenium)提供的专门断言方法,这些方法通常与等待机制结合,提供了更强大、更友好的功能。

场景:使用 Selenium 检查网页上的文本

假设我们要检查一个页面上是否显示欢迎语。

HTML 示例:

<html>
<body>
    <h1 id="welcome-message">Welcome to our website!</h1>
    <p class="status">Login successful.</p>
</body>
</html>

使用 Selenium 的 find_element + Python assert (不推荐,但可行)

这种方法需要你手动管理等待,否则容易出错。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
# 必须先等待元素出现,然后再断言
try:
    # 使用 WebDriverWait 等待元素可见,最多10秒
    welcome_element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "welcome-message"))
    )
    # 现在可以安全地进行断言了
    assert "Welcome to our website" in welcome_element.text
    print("Text assertion successful!")
except Exception as e:
    print(f"An error occurred: {e}")
finally:
    driver.quit()

使用 Selenium 的 assert (更推荐)

Selenium 的 assert 方法(实际上是 unittest.TestCase 的方法)可以与 WebDriverWait 结合,让代码更清晰。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 假设我们继承了 unittest.TestCase 或 pytest 的 fixture
# driver = webdriver.Chrome()
# driver.get("https://example.com")
# 使用 WebDriverWait 的 text_to_be_present_in_element 方法
# 这是最直接的方式,它会一直等待直到元素的文本包含指定的内容
try:
    WebDriverWait(driver, 10).until(
        EC.text_to_be_present_in_element((By.ID, "welcome-message"), "Welcome to our website")
    )
    print("Selenium text assertion successful!")
except Exception as e:
    print(f"Text not found within the time limit: {e}")
# driver.quit()

使用 pytest + Selenium (现代测试最佳实践)

pytest 是一个非常流行的 Python 测试框架,它与 Selenium 结合得天衣无缝。

# test_example.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10) # 隐式等待作为后备
    yield driver
    driver.quit()
def test_welcome_message(driver):
    """
    测试页面欢迎语是否正确。
    """
    driver.get("https://example.com")
    # 使用 pytest 的断言,结合 WebDriverWait
    # 这种方式清晰、易读,并且能提供详细的失败报告
    welcome_element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "welcome-message"))
    )
    # 使用 pytest 的 assert 语句
    assert "Welcome to our website" in welcome_element.text
    # 也可以断言文本完全匹配
    # assert welcome_element.text == "Welcome to our website!"

总结与对比

方法 优点 缺点 适用场景
Python assert 简单、内置,无需额外库。 不健壮,无等待机制。
失败时信息不友好。
在测试中会中断整个测试进程。
代码内部的逻辑检查(如函数参数验证、状态检查)。不推荐用于自动化UI测试。
Selenium EC.text_to_be... 内置等待机制,非常健壮。
专门为Web元素设计,代码简洁。
主要与Selenium一起使用,不适用于纯Python脚本。 Selenium自动化测试中检查元素文本是否出现或包含特定内容的首选方法。
pytest + Selenium 结合了pytest的强大功能和Selenium的Web操作能力。
断言清晰,失败报告极其详细。
支持Fixture、Parametrize等高级测试特性。
需要安装pytestselenium库。 现代Web自动化测试的标准做法,推荐用于所有项目级的UI测试。
  • 如果你只是在写一个普通的Python脚本,想检查一下字符串变量是否符合预期,用 assert 完全可以。
  • 如果你是在做Web自动化测试,请务必使用测试框架(如pytest)提供的断言方法,并配合Selenium的WebDriverWaitexpected_conditions,这样你的测试才会稳定、可靠且易于维护。
分享:
扫描分享到社交APP
上一篇
下一篇