Skip to content

自动化测试用例

自动化测试用例

这里根据手工测试用例从 P0,P1,P2 级别的用例中选择一部分实现自动化测试。

目标

  1. 提高测试效率:自动化测试可以执行大量重复性高的测试和回归测试,可以节省大量手动测试时间和资源。

  2. 提高测试质量:自动化测试能在详情和精度上超越人工测试,使测试结果更可靠和一致,避免因人为失误导致的测试缺陷。

  3. 提升覆盖率:借助自动化测试,我们可以轻松执行那些手动测试难以完成的大规模和复杂测试,例如对系统所有功能的覆盖、压力测试等,从而提高了测试覆盖率。

  4. 实现快速反馈:自动化测试可以在很短的时间内提供关于系统状态的反馈,有利于开发人员快速定位问题并进行修复。

  5. 节省成本:虽然初期投入可能较大,但从长远角度看,自动化测试可以大幅减少人力资源投入,降低测试成本。

步骤

  1. 定义测试策略和计划:定义自动化测试要覆盖的功能模块,拟定测试流程,根据这个流程,制定出自动化测试计划和策略。

  2. 选择测试工具:根据你的产品选择最适合的自动化测试工具,如 Selenium,Jmeter 等。

  3. 编写测试用例和脚本:根据测试计划和策略,编写自动化测试用例,然后进一步编写自动化测试脚本。

  4. 运行和维护测试脚本:执行自动化测试脚本,对错误进行调试,确保测试脚本正确无误。随着应用功能的更新和变化,定期维护和更新测试脚本。

  5. 生成测试报告并分析:自动化测试结束后,工具会生成测试报告,对测试结果进行分析,以便更好地了解产品的质量情况。

参考示例

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