尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

解决自动化不稳定,这一篇就够了

解决自动化不稳定,这一篇就够了 面试求职「面试试题小程序」 内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试命中率杠杠的。大家刷起来…职场经验干货软件测试工程师简历上如何编写个人信息一周8个面试软件测试工程师简历上如何编写专业技能一周8个面试软件测试工程师简历上如何编写项目经验一周8个面试软件测试工程师简历上如何编写个人荣誉一周8个面试软件测试行情分享这些都不了解就别贸然冲了.软件测试面试重点搞清楚这些轻松拿到年薪30W软件测试面试刷题小程序免费使用永久使用每天早上打开邮箱又看到你的自动化测试失败了明明昨天还是一片漂亮的绿色 —— “All Passed”。然后你回忆后发现昨天开发根本没有任何代码更新。你意识到——这不是应用的Bug你写的自动化测试代码开始变得脆弱了脆弱的自动化测试的危害你可能会想“好吧只是几个 false negative重跑两次就好了”。但问题远比想象中严重随着时间推移这些“不稳定”的测试会慢慢腐蚀你辛辛苦苦写的自动化测试让它开始成为团队的鸡肋。原因如下:1、可信度崩塌当测试报告频繁出现误报开发者和团队成员会开始习惯。他们会想“嘿估计又是一次误报”。长此以往自动化测试的邮件报告变成了他们无视甚至会需要过滤的邮件哈哈。最终没人再认真对待测试结果自动化测试的价值也随之被削弱 ——甚至间接影响到你作为测试工程师在团队中的话语权和信任度。2、部署延迟每一次误报都会阻止CICD Pipeline成功执行开发提交的代码可能会延误数小时乃至数天被部署到测试环境。而这一切可能就只是因为一个“不稳定的断言”或“没有及时加载的元素”。3、隐藏真实缺陷脆弱的测试会让原本应该继续执行的测试步骤没有执行从而遗漏了真正的错误。并且我们以为又仅仅是一次误报那就直接合进去了碰巧作为测试的你也没有发现这个漏洞一次缺陷逃逸就这样在你的眼皮底下发生了4、ROI 直线下降因为不断的误报自动化测试工程师必须花时间调试、修复那些并非业务问题而错误的测试用例。久而久之自动化测试带来的收益却在不断下降甚至有些项目因为不断的误报就停用了自动化测试。维护成本上升 信任度下降 自动化测试 ROI 下降。如何有效避免脆弱的测试1、使用稳定的定位方式你是不是很擅长和喜欢Xpath定位别因为写出一个复杂的Xpath定位而太过得意了因为开发一旦改了个 div 结构然后你的自动化测试全军覆没这几乎是每个自动化测试工程师都经历过的噩梦。示例代码// ❌ Bad example await page.click(//div[classform-container]/div[2]/div[1]/button) // ✅ Good example - 使用>import pytest import psycopg2 pytest.fixture(scopefunction) def setup_test_order(): 在测试前创建一个订单测试结束后删除 conn psycopg2.connect(dbnametest userpostgres password123456) cur conn.cursor() # 插入一条测试订单 cur.execute( INSERT INTO orders (id, user_id, product_name, status) VALUES (1001, 1, TestProduct, Created); ) conn.commit() # 将订单 ID 提供给测试用例使用 yield 1001 # 测试结束后清理测试数据 cur.execute(DELETE FROM orders WHERE id 1001;) conn.commit() conn.close()2.使用一次性的测试数据库这种方式一般在CI中经常用到 比如我们可以在Github Action中使用docker运行一个干净的数据库然后通过后端提供的数据库ORM来创建一个干净的数据库。下面是一个示例​​​​​​​name: Run Tests with Fresh Database on: push: branches: [ main ] pull_request: jobs: test: runs-on: ubuntu-latest services: postgres: image: postgres:14 ports: - 5432:5432 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: 123456 POSTGRES_DB: testdb options: - --health-cmdpg_isready -U postgres --health-interval5s --health-timeout5s --health-retries5 env: DATABASE_URL: postgresql://postgres:123456localhost:5432/testdb steps: - name: Checkout repository uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.11 - name: Install dependencies run: | pip install -r requirements.txt - name: Initialize database schema run: | flask db init - name: Run tests # 假设测试代码在一个仓库中 run: | pytest -v --maxfail1 --disable-warnings3.备份与还原Snapshot Rollback在大型的项目中准备测试数据往往会是比较麻烦和耗时的这时可以将数据先dump出来做个备份然后在每次测试前进行还原。以下是Postgres和MySQL数据库的操作命令:PostgreSQL​​​​​​​pg_dump -U postgres -d mydb snapshot.sql psql -U postgres -d mydb snapshot.sql # 恢复MySQL​​​​​​​mysqldump -u root -p mydb snapshot.sql mysql -u root -p mydb snapshot.sql备份还原可以和之前提到的一次性测试环境结合使用例如先使用docker起一个测试数据库然后将dump出的sql文件直接导入。​​​​​​​name: Run Tests with Fresh Database on: push: branches: [ main ] pull_request: jobs: test: runs-on: ubuntu-latest services: postgres: image: postgres:14 ports: - 5432:5432 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: 123456 POSTGRES_DB: testdb options: - --health-cmdpg_isready -U postgres --health-interval5s --health-timeout5s --health-retries5 env: DATABASE_URL: postgresql://postgres:123456localhost:5432/testdb steps: - name: Checkout repository uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.11 - name: Install dependencies run: | pip install -r requirements.txt # ✅ 导入数据库快照文件 - name: Restore test database from snapshot run: | sudo apt-get update sudo apt-get install -y postgresql-client psql -h localhost -U postgres -d testdb -f db/snapshot.sql env: PGPASSWORD: 123456 - name: Run pytest tests run: | pytest -v --maxfail1 --disable-warnings3、适时的断言有时候你的测试在自己本地运行时非常完美刷刷刷的都是通过了可是一旦到了CICD中就开始频繁出现元素找不到timeout等错误。为什么那可能是你忽略了在测试环境中的不稳定因素特别是在CI环境里的网络或页面渲染的速度都不如你本地运行稳定和快速在这种情况下应该要尽量多的特别是在一些关键步骤前对关键元素和重要节点进行合理的断言或等待。当然我并不是让您加上wait或time.sleep这样会拖慢你整体运行的时间。我想说的是在关键元素或者页面出现提交或跳转时加入合适的断言。好吧我知道playwright是有自动等待机制的那为什么还要这样做呢但是你先别急。为什么有了智能等待还要写断言Playwright 的等待机制确实能让测试自动暂停直到元素“可交互”为止。但那只是技术层面的, 而我们在测试中更需要的是“业务层面的确定性”。假设我们在提交表单后页面应该跳转并显示一条成功信息。好的做法​​​​​​​await page.get_by_role(button, nameSubmit).click() await expect(page.locator(#message)).to_be_visible(timeout8000) await expect(page.locator(#message)).to_have_text(Submitted successfully)这段代码的好处● 稳定性Playwright会等待#message元素真正出现在后面的测试操作之前多了一个等待有了容错空间。● 可读性从代码结构上可以一眼看出——这里有“页面跳转 / 状态变更”就能明确知道测试意图如果出错了你可以也清楚的知道问题帮助你判断。最后下方这份完整的软件测试视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】​​​
返回列表