Python栈最佳自动化测试框架

963 篇文章 0 订阅
959 篇文章 32 订阅

Python在测试领域的作用主要体现在自动化测试方面,‌它具有多个优势,‌使得越来越多的软件测试工程师选择使用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"

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

在这里插入图片描述

 ​​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值