Python栈最佳自动化测试框架

人生苦短,我用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 Page

Open Browser ${LOGIN URL} ${BROWSER}

Maximize Browser Window

Set Selenium Speed ${DELAY}

Login Page Should Be Open

Title Should Be Login Page


Go To Login Page

Go To ${LOGIN URL}

Login Page Should Be Open


Input Username

[Arguments] ${username}

Input Text username_field ${username}


Input Password

[Arguments] ${password}

Input Text password_field ${password}


Submit Credentials

Click Button login_button


Welcome Page Should Be Open

Location 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"

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值