前言

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

  问题一:自动化测试脚本的不稳定性

  描述:测试脚本可能在不同的环境下运行不稳定,或者由于网络波动影响的程序找不到对应的定位元素。

  解决方法:

  · 使用稳定的元素定位策略,如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则代码入库,否则报错并发送邮件通知。

  问题十四:学习曲线和技能短缺

  描述:自动化测试可能需要特定的技能和知识,团队成员可能需要时间来适应。

  解决方法:提供适当的培训和技术支持,并主动学习新的知识,将学习到的知识运用到项目中。

  总结

  自动化测试是一个复杂的过程,但它为软件开发带来了巨大的价值。通过识别和解决自动化测试中的常见问题,团队能够更有效地利用自动化测试,提高软件质量和开发效率。通过上面十四解决方案和示例,我们希望为您提供在自动化测试过程中应对挑战的实用指导。但是自动化测试的过程中不仅仅只有这些问题,还有其他的问题,小伙伴们可以留言写出来,大家一起解决。

更多推荐