webtest / autotest4 / auto interface / uitest / cypress ui / playwright / etest / espresso / mitmproxy / unittest / swagger

s

1. 自动化接口测试用例怎么设计?

2. 框架封装的设计思路如何确定?

3. 从0开始手写接口自动化测试框架

4. 如何成长为合格的测试开发

进入直播间链接:http://gvce.njxszf.cn/XrXvVq

 

【今晚直播】测试必备技能 - Fiddler接口抓包 3大实战应用盘点

1.移动端测试- Fiddler快速定位BUG归属

2.引弱网测试- 3G/4G/5G/WIFI/网络切换

3.接口测试-Mock实现异常数据模拟

4.在职软件测试进阶路线分析

点击直播入口:http://gvce.njxszf.cn/XrXvVq

- python unittest 测试开发中的幂等性

在测试开发中,幂等性(Idempotence)是一个重要的概念,它指的是一个操作无论执行多少次,其结果都是相同的。幂等性在分布式系统、网络通信、数据库操作中尤其重要,因为它确保了即使在出现重复请求或操作的情况下,系统的行为也是可预测的。

- 幂等性案例

  1. HTTP GET请求

    • 描述:HTTP GET请求用于从服务器检索数据。GET请求是幂等的,因为多次执行相同的GET请求,其结果(即返回的数据)应该是相同的。
    • 测试案例:发送相同的GET请求多次,验证返回的数据是否一致。
  2. HTTP PUT请求

    • 描述:HTTP PUT请求用于更新服务器上的资源。PUT请求是幂等的,因为多次发送相同的PUT请求,资源的状态应该是相同的。
    • 测试案例:发送相同的PUT请求多次,验证资源的状态是否保持不变。
  3. 数据库更新操作

    • 描述:数据库中的更新操作(如SQL的UPDATE语句)是幂等的,因为无论执行多少次,数据库中的数据状态应该是相同的。
    • 测试案例:对数据库中的同一记录执行多次更新操作,验证数据是否保持一致。
  4. 分布式系统中的消息处理

    • 描述:在分布式系统中,消息可能会因为网络问题而被重复发送。幂等性确保即使消息被重复处理,系统状态也不会受到影响。
    • 测试案例:模拟消息重复发送的情况,验证系统是否能够正确处理重复消息,不会导致数据不一致。
  5. 支付系统

    • 描述:支付系统需要保证交易的幂等性,以防止用户因为重复提交支付请求而产生多次扣款。
    • 测试案例:模拟用户重复提交支付请求的情况,验证支付系统是否能够正确处理重复请求,确保不会重复扣款。

- 测试幂等性的方法

  1. 重复执行测试

    • 对于一个操作,重复执行多次,检查结果是否一致。
  2. 模拟网络问题

    • 模拟网络延迟、断开等情况,确保系统能够正确处理重复的请求。
  3. 并发测试

    • 在高并发环境下测试操作的幂等性,确保在多用户同时操作时,系统行为仍然保持一致。
  4. 边界值分析

    • 对于操作的输入参数,使用边界值进行测试,检查系统是否能够正确处理边界情况。
  5. 自动化回归测试

    • 编写自动化测试脚本,定期执行幂等性测试,确保系统更新后仍然保持幂等性。
  6. 错误注入测试

    • 故意引入错误,如模拟数据库操作失败,检查系统是否能够恢复到正确的状态。

通过这些测试方法,可以确保系统的幂等性,从而提高系统的稳定性和可靠性。

-

幂等性(Idempotence)是指一个操作执行多次与执行一次的效果相同。在软件开发中,幂等性是一个重要的概念,尤其是在分布式系统、网络通信和数据库操作中。在测试开发中,确保代码的幂等性是非常重要的,以避免重复操作导致的不一致状态或数据问题。

在Python中,测试幂等性通常涉及以下几个步骤:

1.定义幂等操作:首先,你需要明确哪些操作是幂等的。例如,设置一个值为同一个值的操作是幂等的,而增加一个值的操作则不是幂等的。
2.编写测试用例:为每个幂等操作编写测试用例,确保无论操作执行多少次,结果都是一致的。
3.模拟幂等性破坏:在测试用例中,尝试通过各种方式破坏幂等性,比如在操作执行过程中引入异常,或者在操作之间插入其他操作。
4.验证结果:在测试用例执行后,验证系统状态是否与预期的幂等状态一致。

下面是一个简单的例子,展示如何测试一个幂等操作:

import unittest
'''
在这个例子中,我们定义了两个操作:increment_value 和 set_value。increment_value 不是幂等的,因为每次调用都会改变 value 的值。
而 set_value 是幂等的,因为无论调用多少次,只要 new_value 是相同的,value 的值都不会改变。
在测试用例 test_increment_operation 中,我们尝试多次调用 increment_value,并验证 value 的最终值是否为1。
在测试用例 test_set_value_operation 中,我们尝试多次调用 set_value,并验证 value 的最终值是否为5。
通过这样的测试,我们可以确保幂等操作在多次执行时能够保持一致的结果,从而保证系统的稳定性和可靠性。
在实际的开发和测试中,幂等性测试可能需要结合具体的业务逻辑和上下文环境来设计更复杂的测试场景。
'''
class IdempotentOperationTest(unittest.TestCase):
def setUp(self):
# 初始化测试环境
self.value = 0
def test_increment_operation(self):
# 测试增加操作是否幂等
for _ in range(10):
increment_value(self.value)
self.assertEqual(self.value, 1, "The operation is not idempotent.")
def test_set_value_operation(self):
# 测试设置值操作是否幂等
for _ in range(10):
set_value(self.value, 5)
self.assertEqual(self.value, 5, "The operation is not idempotent.")
def increment_value(value):
# 增加值的操作,不是幂等的
value += 1
def set_value(value, new_value):
# 设置值的操作,是幂等的
value = new_value
if __name__ == '__main__':
unittest.main()

- 分布式系统中实现幂等性

在分布式系统中实现幂等性通常需要考虑多个方面,包括但不限于网络延迟、系统故障、重复请求等。以下是一些常见的实现幂等性的方法:

1. 使用唯一标识
  • 请求ID:为每个请求生成一个唯一的标识符(如UUID),并在服务端记录该标识符。当接收到重复的请求时,服务端可以检查该标识符是否已经处理过,如果是,则直接返回之前的结果。
  • 幂等键:在数据库中使用幂等键(如订单号、交易ID等)来确保操作的唯一性。
2. 使用数据库事务
  • 乐观锁:在数据库表中添加一个版本号或时间戳字段,每次更新时检查版本号或时间戳是否与请求中的一致。如果不一致,则拒绝更新,从而保证操作的幂等性。
  • 悲观锁:在更新数据前先锁定记录,确保在更新过程中不会有其他操作修改该记录。
3. 使用分布式锁
  • 分布式锁:在分布式系统中,可以使用分布式锁来确保同一时间只有一个节点可以执行特定的操作。例如,使用Redis或ZooKeeper等中间件实现分布式锁。
4. 幂等性设计
  • 幂等性接口设计:设计幂等性接口时,确保接口的幂等性。例如,一个创建订单的接口,如果订单已经存在,则不应该再次创建。
5. 幂等性框架
  • 幂等性框架:使用专门的幂等性框架,如上述提到的Taurus.Idempotent,来简化幂等性实现。
6. 幂等性注解
  • 自定义注解:在某些编程语言中,可以使用自定义注解来标记幂等性方法,然后通过AOP(面向切面编程)来实现幂等性逻辑。
7. 幂等性中间件
  • 幂等性中间件:开发或使用中间件来处理幂等性逻辑,如消息队列中间件可以确保消息的幂等消费。
8. 幂等性缓存
  • 缓存结果:对于幂等性操作,可以将操作结果缓存起来,后续的请求直接从缓存中获取结果,避免重复执行。
9. 幂等性日志
  • 操作日志:记录操作日志,以便在出现问题时可以追踪和验证操作是否已经执行。

在实现幂等性时,需要根据具体的业务场景和系统架构来选择合适的方法。通常,幂等性实现会结合多种策略来确保系统的健壮性和数据的一致性。此外,实现幂等性时还需要考虑系统的可扩展性、容错性和性能影响。

- 幂等性测试中工具或框架支持

幂等性测试在软件开发中非常重要,特别是在分布式系统和微服务架构中。以下是一些支持幂等性测试的工具和框架:

1. 分布式幂等性锁框架
  • Taurus.Idempotent:这是一个开源的分布式幂等性锁框架,支持.NET和.NET Core双系列版本。它可以帮助开发者在分布式系统中实现幂等性,避免重复操作,保证系统数据一致性,提高系统的可靠性和安全性
2. 基于Redis的幂等性实现
  • Spring Boot + Redis + Interceptor + 自定义注解:这种实现方式通过在Spring Boot应用中集成Redis,使用拦截器和自定义注解来实现接口的自动幂等性。开发者可以使用Redis的set和exists方法来控制幂等性。
3. 基于数据库的幂等性实现
  • 数据库事务:通过数据库事务的ACID特性,可以保证操作的原子性,从而确保幂等性。例如,使用数据库事务来封装操作,确保要么全部成功,要么全部失败,避免重复执行。
4. 基于状态机的幂等性实现
  • 状态机:使用状态机来记录请求的处理状态,根据请求的当前状态来判断是否已经处理过该请求。如果请求已经被处理过,则直接返回处理结果;否则,处理请求并更新状态。
5. 基于唯一标识的幂等性实现
  • Token机制:为每个请求分配一个唯一标识,并在处理请求时检查该唯一标识是否已经存在。如果唯一标识已经存在,则说明该请求已经被处理过,直接返回处理结果;否则,处理请求并更新唯一标识。
6. 基于分布式锁的幂等性实现
  • 分布式锁:在分布式系统中,使用分布式锁来确保同一时间只有一个节点可以执行操作,从而避免了重复执行。例如,可以利用Redis或ZooKeeper等中间件实现分布式锁。
7. 基于乐观锁的幂等性实现
  • 乐观锁:乐观锁会在更新数据的那一刻进行锁表,其他时间不锁表,在一定程度上提高了服务性能。通过在数据表中添加版本号或时间戳字段,可以实现乐观锁机制。

在选择工具或框架时,需要根据具体的业务场景和系统架构来决定。例如,如果系统是基于.NET开发的,可以考虑使用Taurus.Idempotent框架;如果系统使用了Spring Boot和Redis,可以考虑使用基于Redis的幂等性实现方式。同时,还需要考虑系统的并发量、数据一致性要求等因素,选择最适合的幂等性实现方案。

- 关于幂等性分布式系统中处理并发

在分布式系统中处理并发请求是一个复杂的问题,因为系统可能由多个服务和组件组成,它们可能分布在不同的服务器上,通过网络进行通信。以下是一些处理并发请求的常见策略:

1. 使用分布式锁
  • Redis锁:使用Redis的SETNX命令来实现分布式锁,确保同一时间只有一个请求可以执行特定的操作。
  • ZooKeeper锁:利用ZooKeeper的临时顺序节点和watch机制来实现分布式锁。
2. 使用消息队列
  • 消息队列:通过消息队列(如RabbitMQ、Kafka等)来处理并发请求,将请求放入队列中,由消费者按顺序处理,从而避免直接的并发冲突。
3. 使用数据库事务
  • 乐观锁:在数据库中使用乐观锁机制,通过版本号或时间戳来确保数据的一致性。
  • 悲观锁:在数据库中使用悲观锁,如SELECT ... FOR UPDATE语句,来锁定数据,直到事务结束。
4. 使用幂等性设计
  • 幂等性接口:设计幂等性接口,确保即使在并发环境下,重复的请求也不会对系统状态产生影响。
5. 使用限流和降级
  • 限流:通过限流算法(如令牌桶、漏桶算法)来限制并发请求的数量,防止系统过载。
  • 降级:在系统过载时,通过降级策略(如返回默认值、缓存结果等)来保证核心功能的可用性。
6. 使用缓存
  • 读写分离:使用缓存来减少对数据库的直接访问,提高读取性能。
  • 缓存一致性:确保缓存与数据库之间的数据一致性。
7. 使用分布式会话
  • 分布式会话管理:使用分布式会话管理机制(如Spring Session)来管理用户的会话状态,确保在分布式环境中会话的一致性。
8. 使用分布式事务
  • 两阶段提交(2PC):在需要跨多个服务或数据库进行事务操作时,可以使用两阶段提交协议来保证事务的原子性。
9. 使用服务网格
  • Istio:使用服务网格(如Istio)来管理服务间的通信,提供流量控制、故障恢复、监控等功能。
10. 使用容器化和编排
  • Kubernetes:使用容器化和编排工具(如Kubernetes)来管理服务的生命周期,自动处理服务的扩展和故障转移。

在设计分布式系统时,需要根据业务需求和系统特点选择合适的方法来处理并发请求。通常,这些方法会结合使用,以确保系统的高可用性、一致性和性能。同时,还需要进行充分的测试,包括压力测试和故障恢复测试,以验证并发处理策略的有效性。

 

- swagger 获取接口生成工具

https://ke.lemonban.com/detail/l_667cc7d8e4b0694c9834b9ca/4?app_id=apphwfbw9rt5504&liveType=previous%3Ftype&fromH5=true

https://ke.lemonban.com/live_pc/l_667cc7d8e4b0694c9834b9ca

1、结合真实企业项目,讲解接口、工作中接口测试全过程

2、结合真实企业项目,讲解swagger接口需求分析、用例设计

3、结合真实企业项目,讲解Jmeter/python代码接口脚本设计与执行

4、结合真实企业项目,讲解接口bug定位过程

5、结合真实企业项目,讲解测试报告输出

- Python实现fiddler功能替换的框架mitmproxy

http://120.25.127.201:18001/user/login.html  可以实现的参考范例。

mitmproxy 是一个开源的代理软件,它可以用来拦截、检查、修改和重放网络流量。Python 的 mitmproxy 提供了 API,允许开发者编写 Python 脚本来处理和修改网络数据包,这在开发、测试和诊断网络应用程序时非常有用。
以下是使用 mitmproxy 的基本步骤:

  1. 安装 mitmproxy
    您可以通过 pip 安装 mitmproxy:pip install mitmproxy
  2. 启动 mitmproxy
    在命令行中运行 mitmproxy,它将启动代理服务器:mitmproxy   。这将打开一个命令行界面,您可以在其中实时查看流量。
  3. 配置设备代理
    要拦截流量,您需要在您想要监控的设备上配置代理。配置设备的网络设置,使其指向 mitmproxy 服务器运行的地址和端口(默认为 8080)。
  4. 获取证书
    为了解密 HTTPS 流量,您需要在设备上安装 mitmproxy 的根证书。首次运行 mitmproxy 时,它会生成一个证书,您可以在浏览器中访问 http://mitm.it 来下载并安装适当的证书。
  5.  编写脚本:您可以编写 Python 脚本来处理流量。例如,下面的脚本将修改服务器响应的 body 内容:
    from mitmproxy import http
    def response(flow: http.HTTPFlow) -> None:
    if "example.com" in flow.request.pretty_url:
    flow.response.text = "Hello, mitmproxy!"
    将此脚本保存为 modify_response.py,然后使用以下命令运行 mitmproxy:
mitmproxy -s modify_response.py
  1. 使用 mitmproxy 的命令行工具
    mitmproxy 还提供了其他命令行工具,如 mitmdump 和 mitmwebmitmdump 是一个命令行工具,可以用来记录和重放流量,而 mitmweb 提供了一个基于网页的用户界面。
  2. 阅读文档和示例
    mitmproxy 的官方文档(https://docs.mitmproxy.org/stable/)提供了详细的使用说明、API 文档和示例,可以帮助您更深入地了解如何使用 mitmproxy。
    请确保您的使用符合法律法规和道德标准,不要将 mitmproxy 用于非法或未经授权的网络访问和篡改。

- 接口自动化测试“神技能” - 接口录制生成Python代码

https://xvduz.xetslk.com/sl/1kcXL2

https://www.hctestedu.com/live_pc/l_6620b90be4b0d84d7315eb71

- android espresso

Espresso框架的特点包括:

  1. 简单易用: Espresso提供了直观、简洁的API,易于理解和使用。这使得开发人员可以更容易地编写和维护UI测试用例。

  2. 自动同步: Espresso自动处理UI同步问题。它在测试执行期间等待UI线程空闲,以确保测试步骤在UI准备就绪时执行。

  3. 强大的匹配器: Espresso提供了强大的匹配器(Matchers),使得开发人员能够轻松地定位和操作UI组件。

  4. 视图操作: 支持对Android应用程序中各种视图的模拟用户操作,如点击、输入文本、滑动等。

  5. 异步任务: Espresso能够处理异步任务,确保测试在UI上的异步操作完成后继续执行。

  6. 自定义断言: 允许开发人员定义自己的断言,以验证应用程序的状态是否符合预期。

使用Espresso进行Android应用程序的UI测试有助于开发人员确保用户界面的正确性和稳定性。这对于持续集成和持续交付(CI/CD)流程中的自动化测试非常重要,以便在应用程序发生更改时及时检测并防止引入潜在的bug。

- Playwright 简介

名称 Playwright
类型 浏览器自动化测试工具
开发者 Microsoft
版本 当前支持 Chromium、Firefox 和 WebKit
语言支持 支持多种编程语言,包括 JavaScript、TypeScript、Python 和 C# 等
特点 - 跨浏览器测试
  - 支持多种浏览器引擎(Chromium、Firefox、WebKit)
  - 自动截图和录制视频
  - Headless 模式和有头模式的无缝切换
  - 内置截图、视频录制、网络请求拦截等功能
  - 强大的设备模拟和地理位置模拟功能
  - 良好的并发性能,适用于大规模测试
  - 支持多标签页、浏览器上下文管理
  - 良好的文档和社区支持
适用场景 - 自动化测试
  - 网络爬虫
  - 截图和页面录制
  - 性能测试
  - 用户行为模拟和 UI 测试
平台支持 跨平台,可在 Windows、Mac 和 Linux 上运行
学习曲线 中等,对于有经验的开发者而言相对友好
官方网站 Playwright 官方网站

- python selenium 和 robot framework 和 playwfight 的区别

名称分类 Selenium Robot framework Playwright
学习资源 自动化测试项目方案https://xvduz.xet.tech/s/3luW7x   丢掉Selenium吧,一起玩玩Playwright ,https://juejin.cn/post/6935254409441984520
应用场景 Web 页面 Web应用、移动应用和桌应用、流程自动化等各种GUI应用 用于Web、移动应用和桌面应用自动化
支持语言 Java、C#、Python、JavaScript、Kotlin等 Java、Python等

目前支持JavaScript、Python、.NET、Java等。

总体而言,Playwright在某些方面表现得更好,例如有更好的等待和灵活的API等,执行速度也更快且资源消耗更低,

但同时也不支持某些特殊浏览器,而Selenium则在跨浏览器测试和多浏览器支持方面表现更佳。不同的应用场景需要根据具体的需求选择。

工作原理

1、Selenium WebDriver最初基于JSON Wire Protocol(WP),REST Web协议

2、后使用Web Wire Protocol(W3C WebDriver协议)调用对应浏览器的驱动自动化

使用动词-名词的命名方式

基于关键字驱动、数据驱动、行为驱动等模式,配置+脚本实现自动化

基于DevTools Protocol 调试
序列化 是,支持关键字驱动测试
前端桥接
等待方法

隐式等待、显式等待、强制等待sleep:

driver.implicitly_wait(隐式时间) 

WebDriverWait(driver, 显式时间).until(条件)

sleep 3

等待直到元素存在(WaitUntilElementExists)

等待直到元素失(WaitUntilElementDisappears)

等待直到元素可见(WaitUntilElementisVisible)

等待直到页面包含(WaitUntilPageContains)

等待直到页面加载完成(WaitUntilPageLoaded)

设置等待超时时间,默认为10秒:

Wait Until Element Exists    ${element_locator}    timeout=30s

Playwright提供的等待方法:

waitUntil

waitForSelector

waitForTimeout

多浏览器支持

可以同时运行不同浏览器

但不适合同一场景用多个不同类型浏览器执行

测试代码需要根据不同浏览器调用不同驱动

-

支持同时运行多个浏览器

同时支持测试多种类型的浏览器。

执行速度 较慢,调用浏览器交互较慢 较快,依赖于配置和脚本 更快,通过多进程和异步执行优化
执行稳定性 在某些情况下可能存在些稳定性问题 - 相对较稳定
消耗资源
可移植性 selenium 可以更好地应用于不同的浏览器和平台的自动化测试

可以实现不同平台、不同领域、甚至不同语言之间的自动化测试

 
可维护性 具有良好的开源社区支持和文档

通过关键字驱动、模块化分层等提高代码可维护性

提供丰富的工具和API

自动化程度 Selenium 更注重底层操作,需要进行手动代码变更才能实现自动化

更加注重高级概念,能够更快速、轻松地实现自动化

-

测试报告 通过TestNG、JUnit等生成测试报告 内置测试报告生成框架,支持自定义

内置测试报告生成功能,可生成HTML和JSON报告

end

- eTest 

https://alltheblue.github.io/

 

- 数据驱动测试 DDT 

 

- 数据埋点测试 

数据埋点测试是一种测试方法,用于验证和确保在应用程序或网站中正确实施数据埋点。数据埋点是在应用程序中插入代码,以收集关于用户行为、应用性能和其他关键指标的数据。这些数据通常用于分析用户行为、改进产品功能、了解性能问题、支持决策制定等。数据埋点测试旨在确保这些数据的正确性、完整性和可用性。

据埋点测试通常包括以下步骤:

  1. 定义数据需求:首先,测试团队需要与开发和产品团队合作,明确定义需要收集的数据,包括事件名称、属性和参数。这通常基于产品需求和业务目标。

  2. 实施埋点代码:开发团队会根据定义的数据需求在应用程序中插入埋点代码,通常使用分析工具的 SDK 或 API。这个代码将捕获用户行为和其他事件。

  3. 测试埋点代码:测试团队会针对埋点代码执行测试,以确保代码的正确性。这可能包括验证事件是否正确触发,属性和参数是否正确传递,以及数据是否按预期记录。

  4. 模拟用户行为:测试团队会模拟用户行为,例如访问应用程序的不同页面、执行交互和触发事件,以确保埋点代码能够捕获和记录这些行为。

  5. 数据验证:测试团队会检查收集到的数据,确保它与定义的数据需求相符。他们将验证事件、属性和参数的准确性,以及数据的完整性。

  6. 性能测试:数据埋点代码可能对应用程序的性能产生影响。测试团队也会评估埋点代码对应用程序性能的影响,确保没有不良的影响。

  7. 报告问题:如果发现问题,测试团队将报告给开发团队,以便修复和重新测试。问题可能涉及代码错误、事件丢失、数据不一致等。

  8. 监控和维护:一旦数据埋点正常工作,测试团队可能会建议实施监控,以确保数据持续可用并及时修复问题。

数据埋点测试是保证数据质量和准确性的关键步骤,它有助于确保应用程序或网站能够提供有关用户行为和应用性能的准确和有用的信息。这些数据对于支持业务决策、改进用户体验和解决问题至关重要。

假设你有一个应用程序,其中某个功能要求在按钮点击事件发生时触发数据埋点,你可以编写测试代码来验证这一点。

import unittest
# 模拟应用程序中的事件触发
def simulate_button_click():
# 在这里模拟按钮点击事件的代码
pass
class TestDataTracking(unittest.TestCase):
def test_button_click_tracking(self):
# 模拟按钮点击事件
simulate_button_click()
# 在这里添加数据埋点验证逻辑
# 例如,检查数据是否已成功记录到分析工具或数据库中
# 如果使用的是第三方分析工具,你可能需要模拟其 API 调用来验证数据
# 假设数据已成功记录
is_data_recorded = True
# 验证数据是否已成功记录
self.assertTrue(is_data_recorded, "Data tracking for button click event failed")
if __name__ == '__main__':
unittest.main()

在这个示例中,我们定义了一个名为 test_button_click_tracking 的测试用例,用于模拟按钮点击事件并验证数据埋点。你需要在 simulate_button_click 函数中编写按钮点击事件的模拟逻辑。然后,你可以添加适当的验证逻辑来检查数据是否已成功记录。

常用的Python框架和库,可用于数据埋点测试:

  1. unittest:Python标准库中的unittest是一种通用的测试框架,可以用于编写数据埋点测试用例。它提供了测试装置、断言方法和测试套件的功能。

  2. Pytest:Pytest是一个流行的Python测试框架,它提供了简单的语法、强大的插件系统和易于使用的断言。它适用于各种测试类型,包括数据埋点测试。

  3. Nose:Nose是另一个流行的Python测试框架,它可以用于测试数据埋点,提供测试自动发现和扩展性。

  4. Selenium:Selenium是一个用于自动化Web应用程序测试的框架,可以用于测试Web应用中的数据埋点。它允许模拟用户与应用程序的交互。

  5. Mock 框架:Python中有一些Mock框架,如unittest.mock和pytest-mock,用于模拟函数和对象的行为,以帮助测试数据埋点的记录和传递。

  6. HTTP 测试库:有一些HTTP测试库,如requests-mock和httpretty,用于模拟HTTP请求和响应,以便测试数据埋点在网络通信方面的工作。

  7. 数据分析工具 SDK:如果你使用特定的数据分析工具(如Google Analytics、Mixpanel等),它们通常提供Python SDK,可用于验证数据埋点的记录和传输。

  8. Custom Frameworks:有时,团队可能会构建自定义测试框架,专门用于测试数据埋点,以满足特定的需求和场景。

 

- cypress ui 自动化

前端开发:基于cypress的自动化实践, https://www.cnblogs.com/fnng/p/14583259.html

UI自动化测试框架Cypress介绍和使用 , https://www.cnblogs.com/5566yesongqiao/p/16202162.html

 

# 引用官网的介绍语,快速、简单、可靠的在浏览器测试一切的工具。

cypress是比较新的一个自动化测试工具,引起很强烈的关注,在github的star数目前已经是22k+,可见是很受到广大自动化测试工作者的欢迎。

cypress有哪些与众不同呢?

  1. 时间追溯,cypress可以在测试运行中自动存储视频以及出错时候截屏存储,鼠标滑过命令行时可以看到这个命令行执行时的动画。
  2. 可调试性,不用猜测你的测试是否失败,像使用chrome的DevTools一样直接调试,并且可以快速的追踪到出错栈。
  3. 实时重加载,当测试代码改动过之后,cypress会自动重新加载测试。
  4. 自动等待,不需要添加wait或是sleep在你的测试中,cypress会自动等待命令和assertion。
  5. 测试状态菜单,可以实时看到有多少个测试通过或是没通过。
  6. 访问窗口的尺寸调整,可以随意调整页面访问窗口的尺寸。
  7. 测试统计报告(增强功能,免费版只能支持3个用户登录查看,已经500次的测试结果)

Cypress安装

cypress的安装是非常的简单,国内建议使用npm安装,yarn会一直卡在安装步骤。

1
npm install cypress --save-dev --registry=https://registry.npm.taobao.org

 

Cypress使用

安装结束,我们就可以使用cypress测试了,首先需要添加cypress.json也就是cypress的配置文件。

这里简单编写,可以只写cypress需要访问的服务地址。

1
2
3
4
5
6
7
8
9
10
{
  "baseUrl""http://localhost:8000", #测试访问的路由地址
  "reporter""junit", #报告类型
  "reporterOptions": {
    "mochaFile""results/test-[hash].xml", #输出的文件
    "toConsole"true #是否输出的命令行
  },
  "viewportHeight": 800, # viewPort也就是预览窗的高度
  "viewportWidth": 1600 # viewPort也就是预览窗的宽度
}

  编写完配置文件之后,我们可以通过cypress open本地打开测试窗口

1
cypress open

  

 

 

 可以看到第一次启动时候,会有一个examples的目录,这是cypress自动创建的例子代码,我们可以直接点击右侧的open in IDE打开代码。

 

 

 可以点击右上角的运行所有集成化测试,或是点击单个测试用例单独测试

 

 

 

Cypress的目录结构介绍

1
2
3
4
5
6
7
8
9
10
11
12
├── fixtures # mock数据的存储目录,这里存放了所有mock的json文件
│   ├── orders.json
│   ├── panicBuyings.json
│   └── routers.json
├── integration # 测试用例代码目录
│   ├── orderManagement.spec.js
│   └── panicBuyingManagement.spec.js
├── plugins # 插件目录
│   └── index.js
└── support
    ├── commands.js
    └── index.js

  

Cypress测试代码编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
describe('测试抢购订单管理', () => {
  beforeEach(() => { #每个测试用例调用之前的操作
    const mock = Cypress.env('MOCK') || 'false'; # 自定义环境变量,运行时传递的话需要指定CYPRESS_前缀,这里使用是CYPRESS_MOCK=true cypress open
    cy.server(); # 如果需要mock接口的话,必须要运行server
    if (mock === true) {
      cy.intercept('GET''/panic-buying/manager/orders*', { fixture: 'orders.json' }).as(
        'getOrders',
      ); # 拦截/panic-buying/manager/order*路由,并指定返回数据使用orders.json,定义这个接口是getOrders函数,用于后面测试使用。
    else {
      cy.intercept('GET''/panic-buying/manager/orders*').as('getOrders');
    }
  });
  it('测试订单列表搜索', () => {
    cy.visit('/#/rush-order/list'); #访问页面路径
    cy.wait('@getOrders').its('response.statusCode').should('be.oneOf', [200, 304]); # 等待getOrders函数,也就是接口返回并判断返回状态是200或是304中的一个。
    cy.wait(1000); # 显示的等待1秒
  });
});

  

命令行运行cypress测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
────────────────────────────────────────────────────────────────────────────────────────────────────
 
  Running:  panicBuyingManagement.spec.js                                                   (2 of 2)
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="Mocha Tests" time="11.0930" tests="2" failures="0">
  <testsuite name="Root Suite" timestamp="2021-03-10T15:00:52" tests="0" file="cypress/integration/panicBuyingManagement.spec.js" time="0.0000" failures="0">
  </testsuite>
  <testsuite name="测试抢购管理" timestamp="2021-03-10T15:00:52" tests="2" time="11.0930" failures="0">
    <testcase name="测试抢购管理 测试新建抢购" time="9.2340" classname="测试新建抢购">
    </testcase>
    <testcase name="测试抢购管理 测试列表搜索" time="1.8590" classname="测试列表搜索">
    </testcase>
  </testsuite>
</testsuites>
 
  (Results)
 
  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Tests:        2                                                                                │
  │ Passing:      2                                                                                │
  │ Failing:      0                                                                                │
  │ Pending:      0                                                                                │
  │ Skipped:      0                                                                                │
  │ Screenshots:  0                                                                                │
  │ Video:        true                                                                             
  │ Duration:     11 seconds                                                                       │
  │ Spec Ran:     panicBuyingManagement.spec.js                                                    │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘
 
 
  (Video)
 
  -  Started processing:  Compressing to 32 CRF
  -  Finished processing: /Users/hightall/work/wenyu/dashboard/panic-buying-managemen    (0 seconds)
                          t/cypress/videos/panicBuyingManagement.spec.js.mp4
 
 
====================================================================================================
 
  (Run Finished)
 
 
       Spec                                              Tests  Passing  Failing  Pending  Skipped
  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ ✔  orderManagement.spec.js                  00:03        1        1        -        -        - │
  ├────────────────────────────────────────────────────────────────────────────────────────────────┤
  │ ✔  panicBuyingManagement.spec.js            00:11        2        2        -        -        - │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘
    ✔  All specs passed!                        00:14        3        3        -        -        -

  我们可以看到测试完成后,会自动生成测试运行过程的视频panicBuyingManagement.spec.js.mp4

-

Cypress 是一个用于前端测试的强大框架,特别适用于端到端(E2E)测试。它是由 Bryan Cranston(不是演员 Bryan Cranston,而是软件工程师 Bryan Johnson)创建的,旨在解决传统前端测试工具在速度、稳定性和开发者体验方面的一些常见问题。

主要特点

  1. 实时重载:Cypress 提供了一个内置的测试运行器,可以在测试运行期间实时更新测试和应用的状态,这让调试变得更加直观和高效。

  2. 自动等待:Cypress 自动等待异步操作完成,而无需手动添加等待时间或回调函数,简化了测试编写过程。

  3. 网络请求拦截:Cypress 允许你截获和修改网络请求,这对于测试后端返回特定数据时的行为非常有用。

  4. 命令与断言:Cypress 提供了一系列易于使用的 API 命令,可以模拟用户交互,并对 DOM 元素进行断言。这些命令可以链接在一起形成流畅的测试步骤。

  5. 调试工具:Cypress 提供了内置的调试工具,允许开发者在测试失败时检查应用状态,包括查看 DOM 树、网络请求、调用堆栈等。

  6. 可读性强:Cypress 的测试用例通常具有良好的可读性,因为它使用了清晰的语法和结构。

  7. 插件和扩展:Cypress 支持各种插件和任务,可以通过配置文件 cypress.json 来定制测试行为。

  8. 报告与截图:Cypress 自动生成测试报告,并在测试失败时捕获截图和视频,方便定位问题。

技术栈

Cypress 使用 JavaScript 编写,并且依赖于 Node.js 运行环境。它可以在任何现代浏览器中运行测试,但自身作为测试框架是在 Node.js 环境下运行的。

如何使用 Cypress

安装:首先需要安装 Node.js 和 npm,然后使用 npm 安装 Cypress 到项目中。

npm install cypress --save-dev

初始化:安装完成后,首次运行 npx cypress open 将会自动下载必要的浏览器资源并设置您的项目。

编写测试:Cypress 默认会在 cypress/integration 目录下查找测试文件。您可以使用 JavaScript 来编写测试。

范例:

describe('Example App', () => {
it('displays welcome message', () => {
cy.visit('/')
cy.contains('Welcome to Example App!')
})
})

运行测试:

npx cypress run

或者使用测试 runner UI:

npx cypress open

总的来说,Cypress 是一个旨在简化前端测试流程的强大工具,它提供了一套完整的解决方案,可以帮助开发者更轻松地编写和维护前端测试。

 

end

posted @   siemens800  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示