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, | 断言两个数字或两个表达式相等。 |
pytest.fail() | msg (str) | 如果执行的测试明确失败,则会显示相应的消息。 |
pytest.skip() | allow_module_level(bool) | 忽略显示的错误信息,继续执行测试。 |
pytest.exit() | msg (str) | 退出测试流程。 |
pytest.main() | args=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) |
doctest.testmod() | m][, name][, globs] |
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" |
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
原文地址:https://blog.csdn.net/NHB222222/article/details/142572452
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!