自动化测试用例
自动化测试用例¶
这里根据手工测试用例从 P0,P1,P2 级别的用例中选择一部分实现自动化测试。
目标¶
-
提高测试效率:自动化测试可以执行大量重复性高的测试和回归测试,可以节省大量手动测试时间和资源。
-
提高测试质量:自动化测试能在详情和精度上超越人工测试,使测试结果更可靠和一致,避免因人为失误导致的测试缺陷。
-
提升覆盖率:借助自动化测试,我们可以轻松执行那些手动测试难以完成的大规模和复杂测试,例如对系统所有功能的覆盖、压力测试等,从而提高了测试覆盖率。
-
实现快速反馈:自动化测试可以在很短的时间内提供关于系统状态的反馈,有利于开发人员快速定位问题并进行修复。
-
节省成本:虽然初期投入可能较大,但从长远角度看,自动化测试可以大幅减少人力资源投入,降低测试成本。
步骤¶
-
定义测试策略和计划:定义自动化测试要覆盖的功能模块,拟定测试流程,根据这个流程,制定出自动化测试计划和策略。
-
选择测试工具:根据你的产品选择最适合的自动化测试工具,如 Selenium,Jmeter 等。
-
编写测试用例和脚本:根据测试计划和策略,编写自动化测试用例,然后进一步编写自动化测试脚本。
-
运行和维护测试脚本:执行自动化测试脚本,对错误进行调试,确保测试脚本正确无误。随着应用功能的更新和变化,定期维护和更新测试脚本。
-
生成测试报告并分析:自动化测试结束后,工具会生成测试报告,对测试结果进行分析,以便更好地了解产品的质量情况。
参考示例¶
import allure
import pytest
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from discourse.logger import logger
@allure.epic("在线论坛")
class TestDiscourse:
url = "http://192.168.0.110:9080/"
username = "1083818290@qq.com"
password = "admin123456"
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get(self.url)
self.driver.implicitly_wait(5)
self.driver.maximize_window()
def teardown(self):
self.driver.quit()
def login(self, username, password):
self.driver.find_element(By.XPATH, "//*[@class='btn btn-primary']").click()
logger.info("输入用户名")
self.driver.find_element(By.ID, "email").send_keys(username)
logger.info("输入密码")
self.driver.find_element(By.ID, "password").send_keys(password)
logger.info("点击登录")
self.driver.find_element(By.CSS_SELECTOR, ".btn.btn-primary").click()
@pytest.mark.P0
@allure.feature("【正向验证】搜索标题")
@pytest.mark.parametrize('search_name', ['中', "web自动化测试", "测试", "web"])
def test_search_title(self, search_name):
self.driver.find_element(By.CSS_SELECTOR, ".placeholder-search.form-control").send_keys(search_name, Keys.ENTER)
result = self.driver.find_elements(By.XPATH, "//*[@class='h5 mb-0 link-dark text-break']")[0].text
logger.info(f"查询的内容为:{search_name},查询的结果内容为:{result}")
assert search_name in result
@pytest.mark.P1
@allure.feature("【正向验证】搜索内容")
@pytest.mark.parametrize('search_name', ['售价', "社交媒体", "2022", "demo"])
def test_search_content(self, search_name):
self.driver.find_element(By.CSS_SELECTOR, ".placeholder-search.form-control").send_keys(search_name, Keys.ENTER)
result = self.driver.find_elements(By.XPATH, "//*[@class='small text-truncate-2 mb-2 last-p text-break']")[
0].text
logger.info(f"查询的内容为:{search_name},查询的结果内容为:{result}")
assert search_name in result
@pytest.mark.P0
@allure.feature("【逆向验证】搜索结果为空")
@pytest.mark.parametrize('search_name', [' ', "appium", "自动化的产物", "#"])
def test_search_null(self, search_name):
self.driver.find_element(By.CSS_SELECTOR, ".placeholder-search.form-control").send_keys(search_name, Keys.ENTER)
result = self.driver.find_element(By.XPATH, "//*[@class='mt-5 text-center']").text
logger.info(f"查询的内容为:{search_name},查询的结果内容为:{result}")
assert search_name not in result
@pytest.mark.P0
@allure.feature("【正向】登录验证")
@pytest.mark.parametrize('username, password',
[(username, password)])
def test_login(self, username, password):
self.login(username, password)
# 定位我要提问按钮,如果没有登录成功,不会有这个按钮
self.driver.find_element(By.XPATH, "//*[text()='我要提问']")
logger.info("登录成功")
assert True
@pytest.mark.P0
@allure.feature("【逆向】登录验证")
@pytest.mark.parametrize('username, password',
[(username, "12345678"), ("11122@qq.com", password)])
def test_login_error(self, username, password):
self.login(username, password)
error = self.driver.find_element(By.CLASS_NAME, "invalid-feedback").text
logger.info(f"错误信息为:{error}")
assert error