webtest / autotest4 / auto interface / uitest / cypress ui / playwright / etest / espresso / mitmproxy / unittest / swagger
s
【今晚直播】接口自动化面试突击: 三大经典面试题详解
s
1. 接口自动化无token场景应对方式?
2. 网络问题下的接口重试策略分析?
3. 断言的批量处理问题场景全解析?
4. 经典接口面试问法应对方式整合。
点击进入直播间:https://chgdeccgxhs.tpgsep.cn/c/KhRst43
- playwright 解决 flutter web测试的问题
| 测试目标 | 推荐方式 | 备注 |
|---|---|---|
| 测交互、文本变化 | Playwright get_by_text() |
✅ 适合 Flutter Web |
| 测后端逻辑 | pytest + requests | ✅ |
| 传统 DOM 操作 | Selenium | ❌ 不适合 Flutter Web |
- python unittest 测试开发中的幂等性
在测试开发中,幂等性(Idempotence)是一个重要的概念,它指的是一个操作无论执行多少次,其结果都是相同的。幂等性在分布式系统、网络通信、数据库操作中尤其重要,因为它确保了即使在出现重复请求或操作的情况下,系统的行为也是可预测的。
- 幂等性案例
-
HTTP GET请求:
- 描述:HTTP GET请求用于从服务器检索数据。GET请求是幂等的,因为多次执行相同的GET请求,其结果(即返回的数据)应该是相同的。
- 测试案例:发送相同的GET请求多次,验证返回的数据是否一致。
-
HTTP PUT请求:
- 描述:HTTP PUT请求用于更新服务器上的资源。PUT请求是幂等的,因为多次发送相同的PUT请求,资源的状态应该是相同的。
- 测试案例:发送相同的PUT请求多次,验证资源的状态是否保持不变。
-
数据库更新操作:
- 描述:数据库中的更新操作(如SQL的UPDATE语句)是幂等的,因为无论执行多少次,数据库中的数据状态应该是相同的。
- 测试案例:对数据库中的同一记录执行多次更新操作,验证数据是否保持一致。
-
分布式系统中的消息处理:
- 描述:在分布式系统中,消息可能会因为网络问题而被重复发送。幂等性确保即使消息被重复处理,系统状态也不会受到影响。
- 测试案例:模拟消息重复发送的情况,验证系统是否能够正确处理重复消息,不会导致数据不一致。
-
支付系统:
- 描述:支付系统需要保证交易的幂等性,以防止用户因为重复提交支付请求而产生多次扣款。
- 测试案例:模拟用户重复提交支付请求的情况,验证支付系统是否能够正确处理重复请求,确保不会重复扣款。
- 测试幂等性的方法
-
重复执行测试:
- 对于一个操作,重复执行多次,检查结果是否一致。
-
模拟网络问题:
- 模拟网络延迟、断开等情况,确保系统能够正确处理重复的请求。
-
并发测试:
- 在高并发环境下测试操作的幂等性,确保在多用户同时操作时,系统行为仍然保持一致。
-
边界值分析:
- 对于操作的输入参数,使用边界值进行测试,检查系统是否能够正确处理边界情况。
-
自动化回归测试:
- 编写自动化测试脚本,定期执行幂等性测试,确保系统更新后仍然保持幂等性。
-
错误注入测试:
- 故意引入错误,如模拟数据库操作失败,检查系统是否能够恢复到正确的状态。
通过这些测试方法,可以确保系统的幂等性,从而提高系统的稳定性和可靠性。
-
幂等性(Idempotence)是指一个操作执行多次与执行一次的效果相同。在软件开发中,幂等性是一个重要的概念,尤其是在分布式系统、网络通信和数据库操作中。在测试开发中,确保代码的幂等性是非常重要的,以避免重复操作导致的不一致状态或数据问题。
在Python中,测试幂等性通常涉及以下几个步骤:
下面是一个简单的例子,展示如何测试一个幂等操作:
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()
- 分布式系统中实现幂等性
- 幂等性测试中工具或框架支持
幂等性测试在软件开发中非常重要,特别是在分布式系统和微服务架构中。以下是一些支持幂等性测试的工具和框架:
- Taurus.Idempotent:这是一个开源的分布式幂等性锁框架,支持.NET和.NET Core双系列版本。它可以帮助开发者在分布式系统中实现幂等性,避免重复操作,保证系统数据一致性,提高系统的可靠性和安全性
- Spring Boot + Redis + Interceptor + 自定义注解:这种实现方式通过在Spring Boot应用中集成Redis,使用拦截器和自定义注解来实现接口的自动幂等性。开发者可以使用Redis的set和exists方法来控制幂等性。
- 数据库事务:通过数据库事务的ACID特性,可以保证操作的原子性,从而确保幂等性。例如,使用数据库事务来封装操作,确保要么全部成功,要么全部失败,避免重复执行。
- 状态机:使用状态机来记录请求的处理状态,根据请求的当前状态来判断是否已经处理过该请求。如果请求已经被处理过,则直接返回处理结果;否则,处理请求并更新状态。
- Token机制:为每个请求分配一个唯一标识,并在处理请求时检查该唯一标识是否已经存在。如果唯一标识已经存在,则说明该请求已经被处理过,直接返回处理结果;否则,处理请求并更新唯一标识。
- 分布式锁:在分布式系统中,使用分布式锁来确保同一时间只有一个节点可以执行操作,从而避免了重复执行。例如,可以利用Redis或ZooKeeper等中间件实现分布式锁。
- 乐观锁:乐观锁会在更新数据的那一刻进行锁表,其他时间不锁表,在一定程度上提高了服务性能。通过在数据表中添加版本号或时间戳字段,可以实现乐观锁机制。
在选择工具或框架时,需要根据具体的业务场景和系统架构来决定。例如,如果系统是基于.NET开发的,可以考虑使用Taurus.Idempotent框架;如果系统使用了Spring Boot和Redis,可以考虑使用基于Redis的幂等性实现方式。同时,还需要考虑系统的并发量、数据一致性要求等因素,选择最适合的幂等性实现方案。
- 关于幂等性分布式系统中处理并发
- 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 的基本步骤:
- 安装 mitmproxy:
您可以通过 pip 安装 mitmproxy:pip install mitmproxy - 启动 mitmproxy:
在命令行中运行 mitmproxy,它将启动代理服务器:mitmproxy 。这将打开一个命令行界面,您可以在其中实时查看流量。 - 配置设备代理:
要拦截流量,您需要在您想要监控的设备上配置代理。配置设备的网络设置,使其指向 mitmproxy 服务器运行的地址和端口(默认为 8080)。 - 获取证书:
为了解密 HTTPS 流量,您需要在设备上安装 mitmproxy 的根证书。首次运行 mitmproxy 时,它会生成一个证书,您可以在浏览器中访问http://mitm.it来下载并安装适当的证书。 -
编写脚本:您可以编写 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
- 使用 mitmproxy 的命令行工具:
mitmproxy 还提供了其他命令行工具,如mitmdump和mitmweb。mitmdump是一个命令行工具,可以用来记录和重放流量,而mitmweb提供了一个基于网页的用户界面。 - 阅读文档和示例:
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框架的特点包括:
-
简单易用: Espresso提供了直观、简洁的API,易于理解和使用。这使得开发人员可以更容易地编写和维护UI测试用例。
-
自动同步: Espresso自动处理UI同步问题。它在测试执行期间等待UI线程空闲,以确保测试步骤在UI准备就绪时执行。
-
强大的匹配器: Espresso提供了强大的匹配器(Matchers),使得开发人员能够轻松地定位和操作UI组件。
-
视图操作: 支持对Android应用程序中各种视图的模拟用户操作,如点击、输入文本、滑动等。
-
异步任务: Espresso能够处理异步任务,确保测试在UI上的异步操作完成后继续执行。
-
自定义断言: 允许开发人员定义自己的断言,以验证应用程序的状态是否符合预期。
使用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
- 数据埋点测试
数据埋点测试是一种测试方法,用于验证和确保在应用程序或网站中正确实施数据埋点。数据埋点是在应用程序中插入代码,以收集关于用户行为、应用性能和其他关键指标的数据。这些数据通常用于分析用户行为、改进产品功能、了解性能问题、支持决策制定等。数据埋点测试旨在确保这些数据的正确性、完整性和可用性。
据埋点测试通常包括以下步骤:
-
定义数据需求:首先,测试团队需要与开发和产品团队合作,明确定义需要收集的数据,包括事件名称、属性和参数。这通常基于产品需求和业务目标。
-
实施埋点代码:开发团队会根据定义的数据需求在应用程序中插入埋点代码,通常使用分析工具的 SDK 或 API。这个代码将捕获用户行为和其他事件。
-
测试埋点代码:测试团队会针对埋点代码执行测试,以确保代码的正确性。这可能包括验证事件是否正确触发,属性和参数是否正确传递,以及数据是否按预期记录。
-
模拟用户行为:测试团队会模拟用户行为,例如访问应用程序的不同页面、执行交互和触发事件,以确保埋点代码能够捕获和记录这些行为。
-
数据验证:测试团队会检查收集到的数据,确保它与定义的数据需求相符。他们将验证事件、属性和参数的准确性,以及数据的完整性。
-
性能测试:数据埋点代码可能对应用程序的性能产生影响。测试团队也会评估埋点代码对应用程序性能的影响,确保没有不良的影响。
-
报告问题:如果发现问题,测试团队将报告给开发团队,以便修复和重新测试。问题可能涉及代码错误、事件丢失、数据不一致等。
-
监控和维护:一旦数据埋点正常工作,测试团队可能会建议实施监控,以确保数据持续可用并及时修复问题。
数据埋点测试是保证数据质量和准确性的关键步骤,它有助于确保应用程序或网站能够提供有关用户行为和应用性能的准确和有用的信息。这些数据对于支持业务决策、改进用户体验和解决问题至关重要。
假设你有一个应用程序,其中某个功能要求在按钮点击事件发生时触发数据埋点,你可以编写测试代码来验证这一点。
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框架和库,可用于数据埋点测试:
-
unittest:Python标准库中的unittest是一种通用的测试框架,可以用于编写数据埋点测试用例。它提供了测试装置、断言方法和测试套件的功能。
-
Pytest:Pytest是一个流行的Python测试框架,它提供了简单的语法、强大的插件系统和易于使用的断言。它适用于各种测试类型,包括数据埋点测试。
-
Nose:Nose是另一个流行的Python测试框架,它可以用于测试数据埋点,提供测试自动发现和扩展性。
-
Selenium:Selenium是一个用于自动化Web应用程序测试的框架,可以用于测试Web应用中的数据埋点。它允许模拟用户与应用程序的交互。
-
Mock 框架:Python中有一些Mock框架,如unittest.mock和pytest-mock,用于模拟函数和对象的行为,以帮助测试数据埋点的记录和传递。
-
HTTP 测试库:有一些HTTP测试库,如requests-mock和httpretty,用于模拟HTTP请求和响应,以便测试数据埋点在网络通信方面的工作。
-
数据分析工具 SDK:如果你使用特定的数据分析工具(如Google Analytics、Mixpanel等),它们通常提供Python SDK,可用于验证数据埋点的记录和传输。
-
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有哪些与众不同呢?
- 时间追溯,cypress可以在测试运行中自动存储视频以及出错时候截屏存储,鼠标滑过命令行时可以看到这个命令行执行时的动画。
- 可调试性,不用猜测你的测试是否失败,像使用chrome的DevTools一样直接调试,并且可以快速的追踪到出错栈。
- 实时重加载,当测试代码改动过之后,cypress会自动重新加载测试。
- 自动等待,不需要添加wait或是sleep在你的测试中,cypress会自动等待命令和assertion。
- 测试状态菜单,可以实时看到有多少个测试通过或是没通过。
- 访问窗口的尺寸调整,可以随意调整页面访问窗口的尺寸。
- 测试统计报告(增强功能,免费版只能支持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)创建的,旨在解决传统前端测试工具在速度、稳定性和开发者体验方面的一些常见问题。
主要特点
-
实时重载:Cypress 提供了一个内置的测试运行器,可以在测试运行期间实时更新测试和应用的状态,这让调试变得更加直观和高效。
-
自动等待:Cypress 自动等待异步操作完成,而无需手动添加等待时间或回调函数,简化了测试编写过程。
-
网络请求拦截:Cypress 允许你截获和修改网络请求,这对于测试后端返回特定数据时的行为非常有用。
-
命令与断言:Cypress 提供了一系列易于使用的 API 命令,可以模拟用户交互,并对 DOM 元素进行断言。这些命令可以链接在一起形成流畅的测试步骤。
-
调试工具:Cypress 提供了内置的调试工具,允许开发者在测试失败时检查应用状态,包括查看 DOM 树、网络请求、调用堆栈等。
-
可读性强:Cypress 的测试用例通常具有良好的可读性,因为它使用了清晰的语法和结构。
-
插件和扩展:Cypress 支持各种插件和任务,可以通过配置文件
cypress.json来定制测试行为。 -
报告与截图: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

浙公网安备 33010602011771号