译者 | 晶颜
审校 | 重楼
摘要:Python是测试自动化的最佳编程语言之一,掌握以下7点技巧与最佳实践可以进一步提升测试自动化的性能。
如果你曾使用过JavaScript、Node或其他编程语言执行自动化测试,便会发现使用Python进行自动化测试要容易得多。Python的易用性、高普及率及其提供的大量库都使其成为测试自动化的最佳编程语言之一。
本人长期从事Python测试自动化项目工作,积累了一些获取最佳测试效果的技巧。下文将分享7个技巧和最佳实践,借助这些内容,你将能够实现高效的Python测试自动化。
1.根据项目规格选择合适的测试自动化框架
Python自带测试自动化框架Unittest,但它最适合小项目。如果你期望使用一个能在小型到大型项目中均适用的测试自动化框架,那么Pytest会是更好的选择。
Pytest提供了一种结构化且高效的方式来编写测试用例,以实现更易于管理和可扩展的测试自动化。它还拥有最简单的语法和最全面的插件生态系统。例如,你可以使用pytest-xdist进行并行测试执行。此外,还可以在Pytest上运行用Unittest或Nose 2编写的测试用例。
如果你需要进行更多的机器人过程自动化(RPA)工作,那么机器人框架将是更好的选择。该框架的语法主要采用人类语言,使用起来较为简便。对于Web测试,你还可以将其与其他Python测试框架(如Selenium)集成。
如果你所在的团队采用行为驱动开发(BDD)模式,那么Behave则是最好的框架。在Behave中,编写非技术受众可以理解的测试用例是非常容易的。
总之,建议你选择一个与团队使用的技术栈相匹配的框架,以避免可能出现的沟通障碍。但若你是独立开展工作,Pytest则是最通用且最常用的框架。
2.在Selenium中使用WebDriverWait来解决计时问题
前文提及可将Pytest与Selenium集成以进行Web测试。Pytest在功能测试方面表现出色,而Selenium则将Web自动化提升到了全新高度,尤其是其强大的WebDriver库,具备卓越的浏览器自动化能力。
在Selenium上运行测试时,由于系统需定位元素,必须设置一段预设的等待时间。一旦预设时间(如10秒)结束,驱动程序便会退出。然而,隐式等待存在一定问题,因为不同的元素所需的等待时间各不相同。
因此,相较于依赖隐式等待,更建议将WebDriverWait与expected_conditions结合使用,通过创建某些条件,确保在与元素进行交互之前,这些条件已得到满足。
若测试频繁失败,并不一定意味着Web应用程序存在问题,有可能是应用程序的代码或用户界面发生了某些变化。为避免因测试失败而进行过多的调试工作,务必使用唯一的ID来准确识别Web元素。
3.使用Pytest参数化测试以避免重复测试函数
Pytest的参数化测试特性在节省时间方面的作用不容小觑。在测试自动化过程中,有时需要使用不同的数据集对应用程序中的相同功能进行测试。此时,你无需重复编写测试函数,仅需使用pytest.mark.parametrize,便可使单个测试函数使用不同的参数多次运行。示例代码如下:
如果你想了解是否可以使用Python内置的测试自动化框架运行参数化测试,那么在某些条件下,答案是肯定的。Unittest本身不支持参数化测试,但是你可以为此添加一个模块。具体方法如下所示:
4.通过并行测试加速测试执行
测试套件中的API、测试用例、数据库和第三方系统越多,执行过程中产生的延迟就会越多,这无疑会拖慢开发速度。值得庆幸的是,有一种方法可以在不篡改测试套件的情况下解决这个问题。Python允许使用Pytest等框架进行并行测试,借助此功能,你可以使用多个CPU并行运行多个测试。
下面将展示如何使用Pytest执行并行测试:
你还可以增加处理负载的CPU数量,但是能够处理负载的本地基础设施有限。如果你的CPU不足以处理你的测试套件,那么建议使用像Lambda这样的云平台来测试应用程序在不同浏览器和操作系统上的表现。
5.将测试自动化融入CI/CD管道中
请相信,如果处于快节奏的开发周期中,手动调整代码的工作将接连不断,每次软件发生变更时,都得手动对代码进行调整,几乎没有喘息的机会。
而将Python测试自动化整合到CI/CD管道中,就能够在代码发生更改时自动执行测试。如此一来,便能快速发现漏洞,并及时发布改进后的应用版本供用户使用。
具体操作是把Python测试自动化集成至CI/CD管道里。在项目中添加 Pytest -cov ,通过Pytest命令自动执行测试并标记出任何问题。具体步骤如下:
如果你需要处理更大规模的测试套件,就需要向诸如Jenkins之类的CI工具添加机器人框架。对于Unittest而言,coverage功能可使测试集成到类似的管道中,示例如下:
6.独立运行测试
Python测试自动化可能遇到的一个常见问题是,由于测试之间存在相互依赖关系而导致测试中断。简单来说,就是因为某个测试依赖于其他测试的数据或环境条件,所以一旦其中一个测试被修改,其他测试就可能会因更改引发的连锁反应而失败。为解决这一问题,需要将所有测试进行隔离,使每个测试在开始运行时都不与其他测试产生关联。这样一来,在进行调试时,就无需顾虑其对其他测试造成的连锁影响。
以下展示如何在Pytest中运用setup和teardown逻辑来确保测试隔离:
需要注意的是,Pytest fixture会确保在每次测试后清理你使用的资源,这使得在测试执行完毕后,环境能够恢复到初始状态。
7.坚持最佳测试自动化实践原则
在此着重介绍几个提高Python测试自动化效率的最佳实践方法:
- 在开启测试自动化工作之前,为测试套件设定测试指标。诸如代码覆盖率、执行的测试用例数量、通过或失败情况以及测试执行时间等测试指标,有助于跟踪测试过程并确定需要解决的瓶颈问题。
- 团队中的每位成员在很大程度上都应掌握编写端到端(E2E)测试的方法。如此一来,质量便不再是事后才考虑的因素,而是从开发伊始就融入到整个开发过程当中。
- 避免对第三方依赖进行测试,例如那些无法掌控的外部网站或服务器链接。对其进行测试可能会降低测试速度,而且可能会存在cookie横幅或其他导致测试失败的元素。
- 使用断言来验证测试结果是否与预期结果匹配。
- 及时更新测试自动化工具,以便在最新的浏览器版本上对应用进行测试,从而在应用向公众发布之前捕获潜在漏洞。
结语
自动化测试工作颇具挑战性,尤其是在面对一系列看似难以解决的错误时。实践发现,采用测试金字塔模式时,测试自动化出现的错误相对较少。在此模式下,重点关注单元测试和集成测试,而非端到端测试。运用上述所强调的技巧和实践方法,便能够在CI/CD环境中高效地运行持续回归测试,并在代码部署前及时获取即时反馈信息。
原文标题:7 Best Tips and Practices for Efficient Python Test Automation,作者:Pradeesh Ashokan