Python栈最佳自动化测试框架

本文介绍了如何利用Python进行自动化测试,重点关注Robot和PyTest框架,以及它们在测试工具中的应用,如unittest、DocTest和Nose2。作者强调了Python在测试工程师职业发展中的重要性,并探讨了Python在实际项目中的实用技巧和工具如pytest及其插件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件质量保障:所寫即所思|一个阿里质量人对测试的所感所悟。​

人生苦短,我用Python

Python是一种解释型、高级的通用编程语言,较于Java、C++等语言相对比较容易上手。

对于大多数测试工程师而言,工作中运用Python,可以快速开发一些自动化工具,让繁琐的工作自动化实现,例如操作文本、服务器、数据库操作等。

毫不夸张的说,我从测试小白到中高级测试工程师进阶过程中,最大的推动里就是接触了Python,让我发现原来测试工程师并非每天点点点,我们可以把点点点的工作(重复性)交给机器去执行。将体力劳动转化为脑力劳动,进而留出更多哦时间做更具创造性的工作。

因此,Python值得想进阶的测试工程师学习。最近AI大火,测试行业内利用AI技术做测试的论调吹的天花乱坠,例如AI生成用例等,但是实际上自动化测试仍是测试工作中的核心之核心,可以理解为是测试质量的地盘。

本文主要介绍如何搭建测试地盘的工具,如何借助于Python实现自动化测试框架。

测试框架汇总

1. Robot

2. PyTest

1. pytest-xdist:支持分布式测试,可以在多个机器上并行运行测试用例。

2. pytest-cov:可以生成代码覆盖报告,帮助开发者了解代码的覆盖情况。

3. pytest-flake8:可以集成Flake8代码风格检查器,在测试运行时检查代码风格问题。

4. pytest-mock:可以模拟对象,方便测试时隔离对象的行为。

5. pytest-rerunfailures:可以自动重新运行失败的测试用例,节省开发者的时间。

6. pytest-rerunfailures-longtimeout:可以自动重新运行失败的测试用例,并设置较长的超时时间,防止测试长时间运行。

3. Unittest

4. DocTest

5. Nose2

6. Testify

测试工具对比

让我们用一个简短的对比表格快速总结一下这些框架:

测试类型

类别

Robot



 



 

验收测试

关键词驱动测试方法。

Pytest


 

单元测试

特殊而简单的类适配器,使测试更加容易。

unittest


 

单元测试

快速的测试集合和灵活的测试执行。

DocTest


 

单元测试

用于命令提示符和包含应用程序的Python交互式 shell。

Nose2


 

unittest扩展库

一个功能强大且灵活的测试框架,支持多种测试,包括单元测试、集成测试、功能测试等。

Testify


 

unittest扩展库

Robot

  • 最受欢迎的机器人框架是一个基于Python的开源自动化测试框架。

  • 该框架完全用Python编写,用于接受测试和测试驱动开发。在Robot框架中使用关键字风格编写测试用例。

  • 该机器人能够运行Java和.Net,并且还支持在跨平台(如Windows、Mac OS和Linux等)上对桌面应用程序、移动应用程序和Web应用程序等进行自动化测试。

  • 除了验收测试外,机器人还用于机器人流程自动化(RPA)。

  • 强烈建议使用Pip(Python包安装器)安装Robot。

  • Robot的强大功能之一是它使用了表格数据语法、基于关键字的测试、丰富的库和工具集,以及并发测试,这使得它在测试人员中很受欢迎。

*** Settings ***Library           SeleniumLibrary*** Variables ***    ${SERVER}         localhost:7272${BROWSER}        Firefox${DELAY}        0${VALID USER}     demo${VALID PASSWORD}    mode${LOGIN URL}      http://${SERVER}/${WELCOME URL}    http://${SERVER}/welcome.html${ERROR URL}      http://${SERVER}/error.html*** Keywords ***Open Browser To Login PageOpen Browser    ${LOGIN URL}    ${BROWSER}Maximize Browser WindowSet Selenium Speed    ${DELAY}Login Page Should Be OpenTitle Should Be    Login PageGo To Login PageGo To    ${LOGIN URL}Login Page Should Be OpenInput Username[Arguments]    ${username}Input Text    username_field    ${username}Input Password[Arguments]    ${password}Input Text    password_field    ${password}Submit CredentialsClick Button    login_buttonWelcome Page Should Be OpenLocation Should Be    ${WELCOME URL}Title Should Be    Welcome Page

测试执行失败的示例

测试执行成功的示例

方法

包名

功能

导入类型

run()

执行测试

从机器人模块中导入 `run` 函数。

run_cli()

使用命令行参数运行测试。

从机器人模块中导入运行命令行界面的函数。

rebot()

处理测试输出。

从“机器人”模块中导入“rebot”函数。

Pytest

  • PyTest 是一个基于 Python 的开放源代码测试框架,用途广泛,尤其适用于功能测试和 API 测试。

  • PyTest的安装需要使用Pip。

  • 它支持对API、数据库和UI进行简单或复杂文本代码测试。

  • 简单的语法有助于轻松执行测试。

  • 拥有丰富的插件,并且能够并行运行测试。

  • 可以运行任何特定的测试子集。

import pytest                                //Import unittest module//def test_file1_method():               //Function inside class//      x=5      y=6      assert x+1 == y,"test failed"

要运行测试,请使用“py.test”命令。

截图供参考:

方法:

函数

参数

工作

pytest.approx()

expected,
rel=None,
abs=None,
nan_ok=False

断言两个数字或两个表达式相等。

pytest.fail()

msg (str)
pytrace(bool)

如果执行的测试明确失败,则会显示相应的消息。

pytest.skip()

allow_module_level(bool)

忽略显示的错误信息,继续执行测试。

pytest.exit()

msg (str)
returncode (int)

退出测试流程。

pytest.main()

args=None
plugins=None

一旦进程内的测试执行完成,就返回退出代码。

pytest.raises()

expected_exception: Expectation[, match]

断言一个代码块的调用将引发预期的异常(expected_exception),或引发一个失败异常(failure exception)。

pytest.warns()

expected_warning: Expectation[, match]

使用这些函数时,请注意警告信息。

Unittest

  • Unittest 是第一个基于 Python 的自动化单元测试框架,旨在与 Python 标准库一起使用。

  • 支持重用测试套件和测试组织。

  • 它借鉴了 JUnit 的设计,支持包括测试集合、测试独立性、测试用例的设置代码等在内的自动化测试。

Unittest的使用步骤如下:

  • 在程序代码中导入 `unittest` 模块。

  • 你可以自己定义一个类。

  • 在定义的类中创建函数。

  • 将“unittest.main()”放置在代码的底部,以运行测试用例。

import unittest                                 //Import unittest module//def add(x,y):   return x + y class Test(unittest.TestCase):          //Define your class with testcase//    def addition(self):      self.assertEquals(add(4,5),9)<strong>//Function inside class// if __name__ == '__main__':   unittest.main()<strong>//Insert main() method//

执行结果:

方法:

方法

作用

setUp()

在测试方法执行之前被调用,用于准备测试环境。

tearDown()

在测试方法执行完毕后调用,即使测试抛出了异常。

setUpClass()

在单个类的测试之后调用。

tearDownClass()

在单个类的测试之后调用。

run()

运行带有结果的测试。

debug()

运行测试但未产生结果。

addTest()

在测试套件中添加测试方法。

Discover()

从指定目录中查找所有测试模块所在的子目录。

assertEqual(a,b)

用来测试两个对象是否相等。

asserTrue/assertFalse(condition)

测试布尔条件。

DocTest

  • Doctest 是 Python 标准分发版中包含的一个模块,用于白盒单元测试。

  • 它会搜索交互式 Python 会话,以检查是否完全按照所需的方式运行。

  • 它利用了Python的一些特定功能,如文档字符串、Python交互式 shell 和 Python 反向调用(在运行时确定对象的属性)。

  • 核心功能:

    • 更新文档字符串

    • 执行回归测试

  • 函数 testfile() 和 testmod() 用于提供基本的接口。

例子:

def test(n): import math    if not n >= 0:        raise ValueError("n must be >= 0") //number should be 0 or greater than 0    if math.floor(n) != n:               raise ValueError("n must be exact integer")                                                                        //Error when number is not an integer  if n+1 == n:          raise OverflowError("n too large") //Error when number is too large    r = 1    f = 2    while f <= n:                                      //Calculate factorial        r *= f        f += 1    return r if __name__ == "__main__":     import doctest                        //Import doctest    doctest.testmod()                    //Calling the testmod method

函数

参数

doctest.testfile()

filename (mendatory)
[, module_relative]
[, name][, package]
[, globs][, verbose]
[, report][, optionflags]
[, extraglobs][, raise_on_error]
[, parser][, encoding]

doctest.testmod()

m][, name][, globs]
[, verbose][, report]
[, optionflags]
[, extraglobs]
[, raise_on_error]
[, exclude_empty]

Nose2

  • Nose2 是 Nose 的继任者,它是一个基于 Python 的单元测试框架,可以运行文档测试和单元测试。

  • Nose2 基于 unittest,因此它也被称为扩展 unittest 或带有插件的 unittest,该插件旨在使测试更加简单和容易。

  • Nose2 支持多种编写测试和捕获异常的方法。

  • Nose2 支持将包、类、模块和复杂的初始化代码一次性定义,而不是频繁地编写代码。

例子:

from mynum import *import nose def test_add_integers():    assert add(5, 3) == 8 def test_add_floats():    assert add(1.5, 2.5) == 4 def test_add_strings():    nose.tools.assert_raises(AssertionError, add, 'paul', 'carol') // To throw one of the expected exception to pass if __name__ == '__main__':       nose.run()

方法

参数

作用

nose.tools.ok_

(expr, msg = None)

断言的快捷方式。

nose.tools.ok_

(a,b, msg = None)

快速访问“断言 a 等于 b”的方法是: `assert a == b`

nose.tools.make_decorator

(func)

为给定函数复制元数据。

nose.tools.raises

(*exception)

抛出预期的异常。

nose.tools.timed

(limit)

指定测试应在多长时间内通过。

nose.tools.with_setup

(setup=None, teardown=None)

为测试函数添加设置方法。

nose.tools.intest

(func)

函数可以被称作测试。

nose.tools.nottest

(func)

函数不能作为测试对象。

Testify

  • Testify 是用来替代 unittest 和 nose 的。与 unittest 相比,Testify 具有更多高级功能。

  • 执行自动化单元、集成和系统测试更易于提供测试证明。

from testify import * class AdditionTestCase(TestCase):     @class_setup    def init_the_variable(self):        self.variable = 0     @setup    def increment_the_variable(self):        self.variable += 1     def test_the_variable(self):        assert_equal(self.variable, 1)     @suite('disabled', reason='ticket #123, not equal to 2 places')    def test_broken(self):        # raises 'AssertionError: 1 !~= 1.01'        assert_almost_equal(1, 1.01, threshold=2)     @teardown    def decrement_the_variable(self):        self.variable -= 1     @class_teardown    def get_rid_of_the_variable(self):        self.variable = None if __name__ == "__main__":run()

包名

作用

引用

assert

提供全面的系统测试工具。

import "github.com/stretchr/testify/assert"

mock

可以用来测试对象和调用。

import "github.com/stretchr/testify/mock"

require

与 assert 相同,但在测试失败时会停止执行。

import "github.com/stretchr/testify/require"

suite

创建测试套件和方法。

import "github.com/stretchr/testify/suite"

往期系列文章

阿里微服务质量保障系列:微服务知多少

阿里微服务质量保障系列:研发流程知多少

阿里微服务质量保障系列:研发环境知多少

阿里微服务质量保障系列:阿里变更三板斧

阿里微服务质量保障系列:故障演练

阿里微服务质量保障系列:研发模式&发布策略

阿里微服务质量保障系列:性能监控

阿里微服务质量保障系列:性能监控最佳实践

阿里微服务质量保障系列:基于全链路的测试分析实践

- END -


下方扫码关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!

  • 关注公众号, 后台回复【测开】获取测试开发xmind脑图

  • 扫码加作者, 获取加入测试社群!

往期推荐

聊聊工作中的自我管理和向上管理

经验分享|测试工程师转型测试开发历程

聊聊UI自动化的PageObject设计模式

细读《阿里测试之道》

我在阿里做测开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件质量保障

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值