14个实战技巧——解决自动化测试中的痛点
前言
自动化测试是现代软件开发的重要组成部分,它可以帮助团队更快地发现和修复缺陷,提高软件质量,并缩短测试时间。然而,自动化测试并非没有挑战。在这篇文章中,我们将探讨在自动化测试过程中常见的问题,并提供实用的解决方案和详细的例子。

问题一:自动化测试脚本的不稳定性
描述:测试脚本可能在不同的环境下运行不稳定,或者由于网络波动影响的程序找不到对应的定位元素。
解决方法:
· 使用稳定的元素定位策略,如CSS选择器或XPath。
· 实施等待机制,如显式等待,确保元素加载完成后再进行操作。
· 设计测试脚本来处理异常情况,如使用try-except块
例子:在Selenium中,我们可以使用WebDriverWait和expected_conditions来等待元素加载完成,并且使用了try和except进行捕捉异常的状态
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://www.baidu.com/")
try:
# 等待最多10秒,直到元素出现
wait = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw")))
except TimeoutException:
# 如果10秒内元素没有出现,将捕获TimeoutException异常
print("元素在10秒内没有加载完成")
这种方法可以使得我们的Selenium测试脚本更加健壮,能够更好地处理页面加载时间不稳定或元素异步加载的情况。
问题二:测试环境的差异
问题:在不同的测试环境(如开发环境、测试环境、生产环境)中,应用程序的行为可能不同。
解决方式:
· 使用环境变量来配置测试环境。
· 确保所有环境尽可能一致,使用容器化技术如Docker可以帮助实现这一点。
· 在测试脚本中包含环境检查,以适应不同环境的差异。
例子:使用容器化技术如Docker可以帮助我们在不同的环境中保持一致性。通过为应用程序及其依赖创建Docker容器,我们可以在本地开发环境、测试环境和生产环境中运行相同的容器,从而确保应用程序在这些环境中行为一致。
问题三:数据管理
问题:自动化测试中,尽量避免代码和数据在一起,特别是当需要处理大量或动态数据时。
解决方法:使用数据驱动测试,从外部文件(如CSV、XML、JSON)读取测试数据。
例子:测试数据通过yaml的形式进行存放,然后在通过脚本进行读取,放入到测试代码中
# coding:utf-8
import yaml
import requests
file_path = r'D:\test_daily\test.yaml'
with open(file_path, 'r', encoding='utf-8') as f:
t = f.read()
# 通过字典的形式显示
result = yaml.load(t,Loader=yaml.FullLoader)
def test_01():
url = result['test_01']['url']
data = {
'key': result['test_01']['key'],
'city': result['test_01']['city']
}
he={
'Content-Type': 'application/x-www-form-urlencoded'
}
r = requests.post(url,headers=he,data=data)
print(r.text)
问题四:维护成本
描述:随着应用程序的发展,自动化测试脚本可能需要频繁更新,导致维护成本增加。
解决方法:使用Page Object模式等设计模式来提高测试脚本的模块化和可维护性
例子:创建一个LoginPage类来封装登录页面的元素和操作
from selenium import webdriver
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_field = driver.find_element_by_id("username")
self.password_field = driver.find_element_by_id("password")
self.login_button = driver.find_element_by_id("loginBtn")
def login(self, username, password):
self.username_field.send_keys(username)
self.password_field.send_keys(password)
self.login_button.click()
问题五:测试代码的覆盖率不足
描述:自动化测试可能无法覆盖所有功能和场景,特别是对于复杂的应用程序。
解决方法:定期审查测试用例,确保覆盖所有关键功能和业务流程。编写测试用例从主流程开始编写,依次进行增加测试用例,保证测试用例覆盖率提高。
问题六:并行测试和性能问题
描述:当运行大量测试时,可能会遇到性能瓶颈,导致测试执行缓慢。
解决方法:使用测试框架的并行执行功能,或者多线程,多进程进行运行程序
例子:通过pytest-xdist进行分布式执行测试用例。
pytest -n x test01.py
# n :表示 使用并行参数
# x:表示需要启动多少个分布式
问题七:生成测试报告并分析报告内容
描述:测试结果的分析可能变得复杂,特别是当有大量测试用例和失败时。
解决方法:通过测试报告详情的展示出来测试结果多少成功的,多少失败的。并统计出失败次数
例子:通过生产html报告或者allure报告
问题八:测试数据的安全性
描述:使用加密和解密技术来保护敏感数据,确保测试数据不会泄露
解决方法:通过MD5等其他加密内容进行对数据加密
例子:部分登录时程序会进行代码加密,编写自动化时,需要对数据解密在进行加密。禅道登录页面时需要对数据进行加密,通过加密后的数据进行登录
import requests
import re
import hashlib
# 通过session的方式进行请求
s = requests.session()
user = 'anjing_test'
password = 'test_anjing'
url = 'http://127.0.0.1/pro/user-login.html'
r = s.get(url)
# print(r.content.decode('utf-8'))
verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)'? />", r.content.decode('utf-8'))[0]
# 第一次加密密码
pwd1md5 = hashlib.md5()
pwd1md5.update(password.encode('utf-8'))
pwd1_result = pwd1md5.hexdigest()
# 第2次加密
pwd2md5 = hashlib.md5()
pwd2md5.update((pwd1_result+verify).encode('utf-8'))
pwd2_result = pwd2md5.hexdigest()
问题九:测试脚本的复用性
描述:在不同的项目或模块中可能存在相似的测试场景,重复编写测试脚本浪费时间和资源
解决方法:创建可复用的测试库或框架,以便在不同项目中共享测试脚本。
例子:可以将公用的部分模块,统一放入到一个公共文件中,需要的时候直接调用,类似读取Yaml文件
可以到我的个人号:atstudy-js,这里有10W+ 热情踊跃的测试小伙伴们,一起交流行业热点、测试技术各种干货,一起共享面试经验、跳槽求职各种好用的
欢迎加入 ↓ ↓ ↓
AI测试、 车载测试、自动化测试、银行、金融、游戏、AIGC.
问题十:测试环境的搭建和维护
描述:自动化测试需要在一致的环境中运行,环境的搭建和维护可能非常耗时。
解决方法:将自动化测试环境需要用的库,包括对应的版本统一通过txt文件存放,通过pip进行安装,或者通过Docker进行统一配置环境。
例子:通过将需要安装的库放到requirements.txt文件中,然后通过pip进行安装
requests==2.31.0
setuptools==65.5.0
six==1.16.0
tzdata==2024.1
urllib3==2.2.1
pandas>=1.1.4
然后通过pip install-r requirements.txt进行安装
问题十一 :WEB测试跨浏览器测试
描述:应用程序可能需要在多个浏览器上运行,手动在多个浏览器上执行测试是不切实际的。
问题解决:通过多进程的方法启动多个浏览器同时运行自动化测试代码
例子:首先进行对不同浏览器进行封装,通过多进程进行执行自动化测试用例
# 封装浏览器驱动
def Browser(browser):
driver = None
if browser == "ie":
driver = webdriver.Ie()
elif browser == "firefox":
driver = webdriver.Firefox()
elif browser == "chrome":
driver = webdriver.Chrome()
else:
print('输入的正确的浏览器信息')
return driver
# 多进程执行运行自动化测试代码
def run_case(name):
thread_list = []
for i in range(1):
appium_server = threading.Thread(target=test_baidu,args=(name,))
thread_list.append(appium_server)
for j in thread_list:
j.start()
问题十二:接口测试中进行mock数据
描述:开发接口未完成,提前介入,提前进行自动化测试
解决方法:使用Mock服务或API模拟来提前介入测试。
例子:使用pytest-mock进行来模拟接口测试
# weateher_r.py
class Mock_weather():
def weather(self):
'''天气接口'''
pass
def weather_result(self):
'''模拟天气接口'''
result = self.weather()
if result['result'] == '雪':
print('下雪了!!!')
elif result['result'] == '雨':
print('下雨了!!!')
elif result['result'] == '晴天':
print('晴天!!!!')
else:
print('返回值错误!')
return result['status']
# test_01.py
import pytest
from test_01.weather_r import Mock_weather
def test_01(mocker):
# 实例化
p = Mock_weather()
moke_value = {'result': "雪", 'status': '下雪了!'}
# 通过object的方式进行查找需要mock的对象
p.weather = mocker.patch.object(Mock_weather, "weather", return_value=moke_value)
result =p.weather_result()
assert result=='下雪了!'
问题十三:持续集成的集成
描述:自动化代码在本地运行时完全不够的,我们需要研发提交代码后立即执行,方便更快更早的发现问题
解决方法:通过Jenkins进行配置持续集成,更快更早的发现问题
例子:通过在jenkins上配置自动化测试代码,当研发存在提交代码的操作后,进行执行自动化测试代码,最后生成对应的测试报告,如果测试报告PASS则代码入库,否则报错并发送邮件通知。
问题十四:学习曲线和技能短缺
描述:自动化测试可能需要特定的技能和知识,团队成员可能需要时间来适应。
解决方法:提供适当的培训和技术支持,并主动学习新的知识,将学习到的知识运用到项目中。
总结
自动化测试是一个复杂的过程,但它为软件开发带来了巨大的价值。通过识别和解决自动化测试中的常见问题,团队能够更有效地利用自动化测试,提高软件质量和开发效率。通过上面十四解决方案和示例,我们希望为您提供在自动化测试过程中应对挑战的实用指导。但是自动化测试的过程中不仅仅只有这些问题,还有其他的问题,小伙伴们可以留言写出来,大家一起解决。
更多推荐

所有评论(0)