Python大法好!云应用状态机的可靠性测试全攻略

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


摘要

测试云应用程序中的状态机对于可靠性、性能和处理各种情况至关重要。自动化Python脚本模拟真实世界的用例,以暴露问题、错误、弱点和时间问题。

它们还有助于优化性能。其中包含的asyncio和多处理示例提供了对云应用状态机行为的宝贵见解,使产品团队能够构建更强大、更高效的应用。

测试云应用程序中的状态机可以使用它们的API和Python脚本。我之前开发的一个管理浏览器配置文件的云应用程序。这些配置文件用于自动化,包括web抓取,并且需要管理许多不同的浏览器。用户将通过API与服务交互来创建、启动、停止、删除、保存数据/状态等配置文件

一般方法

在深入研究之前,让我们考虑一下状态机测试的一般方法:

  • 确保负责生成输出的代码与状态转换的逻辑分离。

    这种分离增强了状态机的可测试性。

  • 通过关注单个状态和转换来分解测试过程。

    设置初始状态,执行转换方法,并验证结果状态是否符合预期。这种粒度方法有助于精确定位错误,并确保每个转换按预期进行。

    这种系统的方法应该可以捕获大多数错误,但可能会遗漏一些极端情况(孤立地测试单个状态转换,对于复杂的、依赖于上下文的交互或通常只在特定或典型条件下出现的序列并不理想)。也可以很容易地自动化。

  • 测试状态机中每个可能的状态转换

    这包括从初始状态到最终状态的遍历,并检查所有中间转换。通过覆盖所有可能的路径,您可以验证状态机的健壮性。

    在这里,它不仅是关于预期结果定义的状态,而且还应该触发从所有状态的转换(您可能需要这样进行自动化测试)。

  • 通过测试边界条件来探索状态机的能力。

    确定状态机可以处理的最小和最大值,确保它在这些情况下正常工作。这有助于防止意外行为,并确保系统的可靠性。

  • 通过将状态机置于无效输入或意外场景中来测试状态机的弹性。

    验证系统在不破坏其功能或稳定性的情况下优雅地处理此类事件。这种方法旨在解决潜在的问题,并确保状态机处理各种条件的能力。

在更广泛的系统上下文中检查状态机和其他组件之间的交互。对使用状态机的应用程序或服务执行集成和系统测试。确保它在软件系统中按预期工作。

掌握状态机

复杂的状态机及其独特的状态和转换阵列的制作、测试和维护可能令人相当费解。这不仅仅是逻辑正确的问题;也是关于发现任何隐藏的问题,可能会给工作带来阻碍。

下面是我发现在测试状态机、确保它们的可靠性以及评估它们在压力、潜在冲突和外部因素影响下的承受能力时需要记住的一些策略的简要介绍。

测试竞态条件:

竞态条件对状态机的稳定性有很大的风险,因为多个实体可以并发地改变它们的状态。对竞争条件的测试包括并发地、顺序地发送各种转换请求。

通过有意引入冲突的请求,目标是发现可能导致不一致或错误状态转换的缺陷甚至潜在漏洞。

外部中断:

将混乱注入系统涉及测试场景,例如过期的访问令牌token,广泛的应用程序负载,以及在尝试状态更改时持续创建,删除或修改实体。

这种测试对于测试整个应用程序和系统的可靠性是必不可少的。

评估网络挑战:

在分布式系统中,网络通常是复杂性的来源。在网络条件中引入可变性(如延迟、数据包丢失或间歇性连接问题)有助于评估状态机的弹性。这些测试揭示了系统适应非最佳网络环境的能力,以及从中断中优雅恢复的能力。

此外,它可能是一种查找竞争条件的附加技术。当你测试一个软件时,用户可以使用api自动化与之交互来改变系统内部实体的状态,网络连接可能起着至关重要的作用——考虑这些自动化交互的潜在影响很重要。

在不同的网络配置文件上进行不同的测试。例如,您可以使用macOS (Network Link conditioning)或类似的简单工具来完成基本网络配置文件。

处理高负载时:

让系统在高负载下处理大量请求是至关重要的。此测试反映了许多实体同时尝试状态转换的真实场景。其目的是识别系统在极端压力下可能出现的潜在瓶颈、性能中断或意外行为。

作为一个软件,用户可以通过api自动化与之交互,以改变系统内部实体的状态,网络连接可能起着至关重要的作用——考虑这些因素的潜在影响很重要.

技术细节:

了解状态机的技术方面。虽然用户可能只看到两种状态(例如活动和不活动),以及两种转换,但幕后的代码逻辑可能更复杂。

例如,状态机可能涉及额外的状态或步骤,如准备、检查、加密/解密、同步、错误状态等。必须测试所有内容,包括状态机可能陷入任何这些隐藏状态的所有情况。测试人员应该知道并理解所有的状态。

编写脚本以确保可靠性

接下来,让我们考虑使用简单的Python脚本自动化前面提到的一些情况的几种方法。

使用asyncio和httpx

下面的Python脚本模拟了该场景(用户通过API与所考虑的服务进行交互,以创建、启动、停止和删除概要文件,如本文开头所述),通过重复执行不同的操作来初始化到不同状态的转换,从而将负载应用到云服务。

import asyncio
import httpx
HOST = 'https://foo.bar' # 被测应用程序的主机
"""
上述主机不是真实的。
我使用一个随机的主机作为演示目的。

"""
KEY = 'qatest'
HEADERS = {
"x-cloud-api-token": API_KEY
}
NUMBER_OF_CYCLES = 5
# 浏览器代理设置
start_payload = {
"proxy": "http://127.0.0.1:8080", # 你的代理
"""
这不是一个真实代理器。
它可能是只有你在运行的一个本地代理服务。
"""
"browser_settings": "debug"
}

异步函数:get profiles函数从服务获取浏览器配置文件,模拟用户请求配置文件列表的场景。​​​​​​​

async def get_profiles(cl: httpx.AsyncClient):
  resp = await cl.get(f'{HOST}/profiles_list', params={'page_len': 25, 'page': 1}, headers=HEADERS)
  return resp.json()

脚本启动循环,每个循环都涉及异步启动浏览器配置文件——用户并发创建多个浏览器并使用它们。​​​​​​​

async def profile_start(cl: httpx.AsyncClient, uuid):
  resp = await cl.post(f'{HOST}/profiles/{profile_id}/start',   json=data_start, headers=HEADERS)
  if error := resp.json().get('error'):
    print(f'profile_id} - {error}')

启动概要文件后,脚本激活(运行)概要文件,停止它们,然后删除在第一步中获得的所有概要文件。它显示了云服务的响应能力及其在资源清理方面的效率,这一点至关重要。​​​​​​​

async def stop_profile(cl: httpx.AsyncClient, uuid):
  resp = await cl.post(f'{HOST}/profile/{profile_id}/stop', headers=HEADERS)
  if error := resp.json().get('error'):
    print(f'{profile_id} - {error}')
async def delete_profile(cl: httpx.AsyncClient, uuid):
  resp = await cl.delete(f'{HOST}/profile/{profile_id}', headers=HEADERS)
  if error := resp.json().get('error'):
    print(f'{profile_id} - {error}')

进行中的测试

每个循环代表一个模拟的用户交互,创建、使用和删除浏览器配置文件。

async def main():
  async with httpx.AsyncClient(timeout=httpx.Timeout(timeout=300)) as cl:
  for _ in range(NUMBER_OF_CYCLES):
    List_of_profiles = await get_profiles(cl)
    tasks_start = [asyncio.create_task(profile_start(cl, profile['id'])) for item in List_of_profiles]
    await asyncio.gather(*tasks_start)
active_browsers = await get_active_profiles(cl)
  stop_tasks = [asyncio.create_task(stop_profile(cl,   active_browser['id'])) for active_browser in   active_browsers['data']]
  await asyncio.gather(*stop_tasks)
List_ofprofiles = await get_profiles(cl)
  del_tasks = [asyncio.create_task(delete_profile(cl, profile['id'])) for item in List_of_profiles]
  await asyncio.gather(*del_tasks)

使用多处理

我将简要讨论使用Python的multiprocessing模块在高负载下自动测试状态机的另一种方法。

该方法旨在通过并发执行测试脚本的多个实例来测试负载能力和状态机健壮性。

主要目标仍然是并行化脚本的执行,促进与服务和多个概要文件的同时交互,触发从一种状态到另一种状态的转换。

通过使用多处理,这种方法提供了一种有效的方法来模拟与云服务并发交互的大量用户。​​​​​​​

# …
# 你的函数
def run_script():
# 你的函数 1 (步骤 1)
# 你的函数 2 (步骤 2)
# …
# 你的函数N (步骤 N)
if __name__ == "__main__":
for runs in range(0, 5):
  processes = []
for i in range(20):
  p = multiprocessing.Process(target=run_script)
  processes.append(p)
  p.start()
for p in processes:
  p.join()

根据需要定制测试并进行监控

通过自定义循环次数、调整用户交互以及修改脚本以适应特定的API端点和测试场景,您可以获得有关应用程序在不同负载下的性能的宝贵数据。

请记住,您将需要必要的监视工具来获取服务器状态信息、评估服务器负载以及跟踪资源利用率和日志。

利用Grafana, Kibana, Prometheus等工具进行全面监控。此外,密切关注脚本接收到的响应,确保对应用程序的性能、响应代码、代码和代码进行全面评估。

总结

测试应用程序的状态机对于确保它们在各种条件下的可靠性、性能和弹性至关重要。

通过使用Python脚本,您可以自动化测试过程并模拟真实世界的场景,以发现潜在的问题、错误、漏洞和竞争条件,并优化系统性能。

无论是通过asyncio进行异步测试,还是通过multiprocessing进行并行负载测试,这些示例都为了解云应用程序状态机的行为提供了有价值的见解,帮助产品团队构建更健壮、更高效的产品。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值