📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
说起自动化测试框架设计,大家脑海中大多会浮现出以下问题:
-
1)测试数据要怎么准备,如何在框架中实现,是否可复用。
-
2)测试用例的批量导入。
-
3)用例之间是否存在逻辑关系,相互之间是否有影响,在框架中该如何处理。
-
4)测试执行结果的导出和查看。
-
5)执行失败的用例如何快速定位复现。
-
6)对于UI自动化,当出现异常时(如对象获取不到,无法对对象进行指定操作),框架要如何对应处理,以保证整套用例不会中断执行。
-
7)运用多进程和分布式管理的方式,实现在有限时间内完成大批量测试用例的执行。
-
8)测试结果的数据统计,生成分析图表。
...
这些问题我们都可以在网上找到答案,如下所示:
-
1)在测试数据准备上,尽量做到数据可复用,便于在集成测试时可循环执行。所以可以把数据的初始化通过在数据库当中用sql语句或存储过程的方式实现,并且可以将此步骤放在自动化测试执行起始或结束处。
-
2)如果团队中测试人员们的技术功底较好,可以考虑直接将测试用例存放在数据库中来批量导入,内存读取效率是很高的。其次也可以把测试用例批量导入的载体换为xml或Excel文件。
-
3)用例之间如果存在逻辑关系,建议对用例进行分组,使各组用例之间相对独立,执行结果或产生异常也能互不影响。
-
4)测试执行结果的导出方式就很多了,结合业务和系统架构场景,怎么方便高效怎么来。查看上做到直观易懂就行。
-
5)对于执行失败的用例原因定位,最好能通过在自动化测试脚本中编辑对应的异常输出日志来定位,而不是单纯靠脚本语言自己提供的报错信息。
-
6)在UI自动化测试中,对于事先无法预知的异常,可以考虑通过事件触发机制来做判断,然后添加上一些比如关闭弹窗、模拟回车和退出键的操作,使得焦点恢复到主窗体,然后通过测试框架的驱动进入到下一组执行用例中。
-
7)学掌门网校有一门课程:《利用Scrapy搭建分布式自动化接口测试框架》,讲的就是以http/s接口测试为例,通过多进程、分布式多主机并发的方式来进行自动化测试的。
-
8)测试结果的统计,包含的信息可以有执行时长、总执行用例数、成功/失败执行用例比、失败用例自动retry次数、本轮执行与上轮执行的不同点统计等等。可关注的点还是蛮多的,当然也可以和项目组成员及产品经理多多交流,听听他们想关注的信息。前端动手能力强的,结合图表方式来展示,自然是更好啦!
...
从这些问题中我们不禁思考, 一个优秀的自动化测试框架应该具备哪些条件?
一个优秀的自动化测试框架应该具备哪些条件?
首先我们要明白:没有万能的测试框架,适合自己项目的,就是好的;其次:测试框架的本质是提升效率;明白了这两点,其实我们也就知道了一个优秀的自动化测试框架一定是先解决了核心功能、效率优化的问题,然后是“可维护性、可扩展性”的问题。概括如下:
-
通用性:能够在各种各样的系统和平台都能够使用;
-
易维护性:能够把我们的数据、用例、框架的实现进行独立的维护,能够在实现完善的过程,快速的定义到维护的点,而不对框架的其他功能造成影响;
-
定时处理:能够在指定的时间执行;
-
持续集成:当被测程序和测试代码有更新能够自动执行;
-
调试:可调试行强;
-
测试结果:测试报告、测试数据的统计分析;
自动化测试框架的设计思路是怎样的?
1.从零开始设计
从零开始设计自动化测试框架,例如,针对一款编程语言,单元测试框架一般需要作为基础库被设计并集成到编程语言中。
标准化的测试结构。单元测试框架提供了一种统一的结构化方式,让开发者以一致的方式组织和运行测试。
-
生命周期方法: 通常框架会定义一套标准化的生命周期钩子,用于在每个测试方法执行前后进行资源管理:setUp/beforeEach: 在每个测试运行之前初始化测试环境(如创建测试数据、实例化对象)。tearDown/afterEach: 在每个测试运行后清理资源(如关闭数据库连接、删除临时文件)。
-
测试方法的命名: 通常有特定约定。例如,以 test_ 开头(Python 的 unittest)或用 @Test 注解(Java 的 JUnit)。这种约定使得框架可以自动发现测试方法。
-
独立性: 每个测试方法应保持独立,不依赖其他测试。测试之间的隔离有助于更快地定位问题。
断言机制。断言(Assertions)是单元测试的核心,用于验证被测代码的行为是否符合预期。断言的作用如下:
-
独立性: 每个测试方法应保持独立,不依赖其他测试。测试之间的隔离有助于更快地定位问题。通过对输入和输出的验证,确保代码逻辑正确。
-
如果断言失败,则测试会立即终止并报告错误。
测试发现。测试发现是单元测试框架的一项重要功能,能够自动找到符合规范的测试。
框架会扫描特定的模块或文件夹,找到符合命名约定的方法。例如,在 Python 中,pytest 会自动发现以 test_ 开头的方法。在 Java 的 JUnit 中, @Test 注解标识的方法会被识别为测试方法。
测试套件和测试运行器。测试套件和运行器使得开发者可以高效地组织和执行测试。
-
测试套件(Test Suite):测试套件是一个集合,用于将多个测试用例组合在一起运行。通过它我们可以方便地对测试用例进行分组管理。
-
测试运行器(Test Runner):测试运行器负责执行测试并收集测试结果。
测试报告和结果反馈。测试报告用于展示测试的执行结果,帮助开发者快速了解代码的健康状态。测试结果的分类如下:
-
通过(Pass): 测试正常完成且所有断言成功。
-
失败(Fail): 测试未通过,某个断言失败。
-
错误(Error): 测试执行过程中抛出了未预期的异常。
-
跳过(Skip/Ignore): 测试因某些条件未被执行。
-
扩展:xUnit被认为是许多主流编程语言的单元测试框架的雏形和灵感来源。xUnit 是一种架构模式,最早由 Kent Beck 和 Erich Gamma 在 SUnit(Smalltalk 的单元测试框架)中提出,并成为了测试框架设计的标准。其设计思想和概念被广泛应用到其他语言中,例如 JUnit(Java)、NUnit(.NET)、pytest(Python)等。
2.基于单元测试框架二次开发
基于单元测试框架二次开发指在单元测试框架的基础上,更偏注重于扩展各种测试能力。
通常,单元测试框架已经提供了基础的测试能力,为了更好地支撑各种类型的测试,我们可以在此基础上进行扩展,以便于满足不同类型的需求。
基于单元测试框架二次开发的方向比较多,取决于基于框架设计的定位和目标。以下是常见的扩展功能。
数据驱动。数据驱动是自动化测试中最常见的功能之一,可以有效地减少样例代码的编写,提高测试用例编写的效率。
-
数据驱动装饰器:可以通过数据驱动装饰器来驱动测试测试用例(方法), 例如,Seldom框架的 @data([]) 装饰器。
-
数据驱动文件:通过数据驱动文件读取不同类型的数据文件。例如,Seldom框架的 @data_file("./data/file.json")管理测试数据。
定制化测试报告。测试报告是自动化测试框架的非常重要的功能,我们需要对测试报告做一些定制化开发。
-
个性化测试样式和内容:例如,显示公司logo、人员个名称和角色等。
-
生成不同的报告类型:不同的运行模式需要不同的报告类型。例如,在本地执行需要HTML格式的报告,在CI/CD 或平台化执行需要XML、JSON格式的测试报告。
脚手架工具。集成脚手架工具,可以快速的生成 自动化测试项目模板。
关于自动化测试项目模板,文章的开头已经介绍,这里不再阐述。
集成消息功能。每个公司都有自己的通讯工具,邮件、钉钉、企微、飞书等。通过调用相关工具的API,实现发消息功能,可以让测试的运行结果更快的发送给相关人员。
3.集成各种测试库
基于框架的定位,可以集成不同类型的测试库,并对这些库进行二次开发,使框架的使用更加高效统一。
-
Web UI测试:如果是为了实现Web UI自动化测试,那么可以集成 Selenium、Playwright等测试库,并对这些库的API进行二次封装。
-
API 测试:如果是为支持接口测试,那么可以集成 Requests、webSocket、gRPC等测试库,并对这些库的API进行二次封装。
-
App UI测试:如果是为了实现App UI自动化测试,那么可以集成 Appium、uiautomator2 等测试库,并对这些库的API进行二次封装。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】