服务端相关 / 在 PyCharm 里测试代码

在 PyCharm 里执行测试

在实际工作学习中,在我们编写代码,经过调试与运行,完成预设的功能后,许多时候我们还需要编写测试代码去测试刚刚完成的功能。

测试代码的编写与执行一般都基于一些成熟的测试框架,在框架内调用待测代码方法,进行断言判断来验证待测代码是否完成期望功能。

本节主要讲述在 PyCharm 内创建测试与执行测试的步骤,以及其中提供的一些主要功能。

1. PyCharm 支持的测试框架

测试框架可以组织、管理和执行那些独立的自动化测试用例,测试完成后统计测试结果。PyCharm 支持主流的测试框架,如图所示:

前三种框架用的比较多,特别是 Pytest 近几年是比较流行的,经常与 request + Allure 搭档用于接口的自动化测试。另外,在基于业务驱动软件公司, BDD 测试框架应用也越来越广泛。大家可以根据自己的实际环境与需求所择合适的测试框架,有关安装及其它更详细信息,请参阅对应的框架文档。

图片描述

图片来源:https://www.jetbrains.com/help/pycharm/testing-frameworks.html

Tips:在开始使用您选择的测试框架之前,请确保在计算机上安装了所需的框架。

2. 在 PyCharm 里执行测试的步骤

2.1 配置测试框架

主菜单: PyCharm/File -> Preference/Settings -> Tools -> Python Integrated Tools, 点击 Default Test Runner 选择 runner。 默认值是 Unittests,下面的过程也会以 Unittests 为例。

图片描述

2.2 创建测试

准备一个简单的待测试类,创建新文件 rectangle.py,添加下面的代码到文件

import math


class Rectangle:
    def __init__(self, length, width, size=(40, 20)):
        self.length = length
        self.width = width
        self._size = size

    def area(self):
        area = self.length * self.width
        return area

    def perimeter(self):

        perimeter = (self.length + self.width) * 2
        return perimeter

    def diff(self):

        diff = math.fabs(self.length - self.width)
        return diff
    
    def resize(self, width, height):
        if width <= 0 or height <= 0:
            raise ValueError("illegal size")
        self._size = (width, height)

    def get_length(self):
        return self.length

    def get_width(self):
        return self. width

在编辑器中,将光标放在类声明或方法中的位置。

  • 从主菜单中,选择 Navigate -> Test
  • 编辑器内,右键上下文菜单中选择 Go to -> Test (⌘⇧T: Ctrl + Shift + T)

PyCharm 显示可用测试的列表。如果所需的测试尚不存在,请单击"创建新测试"。在打开 Create test 对话框中进行设置, 点击 OK 会自动生成测试文件与测试类。

图片描述

当你创建了测试后,在测试文件可以通过上下文菜单跳到源程序 Go To -> Test Subject,完成测试文件到源文件切换,反之也可以的通过 Go To -> Test 跳回到测试程序。下面的过程演示了创建测试以及测试文件与源文件的切换过程。
图片描述

2.3 为测试文件配置 运行/调试 配置

前面的创建测试只是帮助我们创建了测试文件结构,具体的测试代码还是需要自己编写的。在进行配置之前,我们需要根据选择测试框架的规范编写测试代码。python unittest 文档参考, 修改上面自动生成的 test_rectangle.py 文件。

from unittest import TestCase
from rectangle import Rectangle


class TestRectangle(TestCase):

    def setUp(self):
        self.rectangle = Rectangle(30, 15)

    def test_area(self):

        area = self.rectangle.area()
        print(area)
        self.assertEqual(area, 450)

    def test_perimeter(self):

        perimeter = self.rectangle.perimeter()
        self.assertEqual(perimeter, 90)

    def test_diff(self):

        diff = self.rectangle.diff()
        self.assertEqual(diff, 15)

    def test_resize(self):

        self.assertRaises(ValueError, self.rectangle.resize, 15, 0)

    def tearDown(self):
        self.rectangle = None

创建 运行/调试配置,有多种方式:

  • 直接点击 运行/配置 配置列表框打开对话框,类型选择 Unittests;
  • Project 窗口选择文件, 右键上下文菜单选择 Create Name;
  • 在编辑器内,右键上下文菜单选择 Create Name。

图片描述
在配置过程中,可以指定测试范围,是模块、类甚至单个测试方法。

2.4 执行测试

通常,PyCharm 通过运行已创建的运行/调试配置,以与其他应用程序相同的方式运行和调试测试。在许多情况下,也可以从上下文菜单启动测试会话,如果运行的测试没有永久运行/调试配置,则创建临时配置。然后,如果以后要重用,可以使用"运行/调试配置"对话框保存此类配置。

1. 下面演示了不同运行路径,可运行整个模块,也可以运行单个方法。在 Run 工具 窗口内可以看到运行结果。工具窗口与通用的 Run 窗口基本一致,但会多一些为测试所加的工具按钮。
图片描述

2. 可以通过 Run 工具栏中 Rerun 与 Rerun Failed Tests 重新运行用例:
图片描述

3. PyCharm 可以设置自动重新运行测试的运行/调试配置(如果源代码已更改)。点击 Run 工具栏中的 Toggle auto-test 按钮该功能生效。

下面只单独运行 test_area 这个方法,按下 Toggle auto-test,然后简单修改这个方法,会看到测试被自动执行了。

图片描述

2.5 查看结果

1. 运行后,会在 Run 工具栏中显示运行结果,具体显示的信息分析如下:

图片描述

2. 在 Run 工具栏顶部工具栏提供更多丰富的功能,帮助查看结果。还可以随时查看以前的历史测试记录,也能把测试结果导入导出。

图片描述

4. 点击最后的设置齿轮按钮,可以进行更多的设置。

图片描述

  • 监视当前测试的执行;
  • 内联显示统计信息,显示用例执行时间;
  • 导航到堆栈跟踪;
  • 在异常发生的情况下打开相应的源代码;
  • 设置自动测试延迟的时间;
  • 在完成测试后,自动选择第一个失败的测试。

5. 如果单元测试包含断言条件失败,右键单击失败的测试,然后选择 View assertEquals Difference 专用的比较器对话框被显示。

图片描述

3. 小结

本小节主要讲解了如何在 PyCharm 里运行测试的基本步骤,以及在测试过程中提供的相关功能。
相关的功能都不复杂,很容易上手。难点在于创建测试以后,如何根据选择的测试框架写测试用例代码,这需要对选择的测试框架、单元测试的理论知识都比较了解;另外,需要对待测代码要足够熟悉,才能写出有效的测试用例。

图片描述