你会写单元测试吗

栏目: 编程工具 · 发布时间: 7年前

内容简介:关于我编程界的一名小小程序猿,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。 联系:hylinux1024@gmail.com也许你已经听说过

关于我

编程界的一名小小程序猿,目前在一个创业团队任team lead,技术栈涉及Android、 PythonJava 和Go,这个也是我们团队的主要技术栈。 联系:hylinux1024@gmail.com

也许你已经听说过 Test Driven Development ,但不知道你是否遵循这个规则呢?其实我自己在写代码的时候也很少会先写单元测试再写业务功能逻辑。这不我也今天也来学习如何在 Python 中写单元测试。

0x00 unittest

Python 中的 unittest 单元测试框架跟其它语言如 JUnit 是类似的。它支持测试自动化、配置共享以及关机代码测试。

假设在我的项目目录下有一个 mysum 模块用于计算列表中各个数之和。 还有一个 test_mysum.py 用于编写单元测试的文件。

myproject/
│
├── mysum/
│   └── __init__.py
└── unittests
    └── test_mysum.py

复制代码

打开 mysum 模块中的 __init__.py 文件。

添加下面的方法

def sum(args):
    total = 0
    for arg in args:
        total += arg
    return total
复制代码

打开 test_mysum.py ,编写单元测试

import unittest

from mysum import sum

class TestSum(unittest.TestCase):
    def test_list_int(self):
        """
        测试一个整数列表的和
        """
        data = [1, 2, 3]
        result = sum(data)
        self.assertEqual(result, 6)


if __name__ == '__main__':
    unittest.main()

复制代码

首先导入我们要测试的模块 mysum 测试用例类通过继承 unittest.TestCase 来实现,测试方法 test_list_int 是以 test 开头的。 在这个方法中定义了一个整型列表,执行 sum 方法,然后判断执行结果是否与预期相符。

最后调用 unittest.main() 来执行这个测试用例

Ran 1 test in 0.001s

OK
复制代码

如果再添加一个方法

def test_list_sum(self):
    data = [1, 3, 4]

    result = sum(data)
    self.assertEqual(result, 6)
复制代码

执行后会看到如下类似信息

6 != 8

Expected :8
Actual   :6
复制代码

从这个输出信息可以看出 期望值与实际值不相符 ,这时候如果我们的测试用例没有问题,那就要看看 mysum 的实现逻辑了。

从这个例子中可以总结一个测试用例的过程:

  1. 构建输入数据
  2. 执行要测试模块,获取执行结果
  3. 与预期结果相比较,根据结果修改代码

0x01 setup/tearDown

在编写单元测试时,还可以重写父类的 setuptearDown 方法,可以在执行测试逻辑开始前和结束时做一些处理。例如在 setup 方法中可以初始化测试数据,在 tearDown 方法做一些清理工作。

import unittest

class TestBasic(unittest.TestCase):
    def setUp(self):
        # 加载测试数据
        self.app = App(database='fixtures/test_basic.json')

    def test_customer_count(self):
        self.assertEqual(len(self.app.customers), 100)

    def test_existence_of_customer(self):
        customer = self.app.get_customer(id=10)
        self.assertEqual(customer.name, "Org XYZ")
        self.assertEqual(customer.address, "10 Red Road, Reading")
    
    def tearDown(self):
        self.app.releaseDB()
复制代码

在每个测试执行时 setuptearDown 都会被执行一次。

0x02 pytest

pytest 是一个第三方测试框架,使用它不需要继承某个类,它可以使用原生的 assert 语句用于测试结果的断言。

它的用法也很简单

首先通过 pip 安装

➜ pip install pytest
复制代码

我们写一个单独的 tests 文件夹下创建测试用例文件 test_pytest.py 。 注意:这里 pytest 的文件必须与上文的 unittests 文件必须区分开,否则会出现 ModuleNotFoundError 。我已经在这里踩坑。

我这里使用 pytest 单元测试的文件结构为

tests
│
└── test_func.py
复制代码

test_func.py 的内容为

# 导入我们要测试的模块
from mysum import sum


def test_answer():
    data = [1, 2, 3]

    assert sum(data) == 5

复制代码

测试方法以 test 开头

然后再命令行中执行

➜ python -m pytest tests/test_func.py 
复制代码

注意:这里要使用 python -m pytest ,如果直接使用 pytest 会提示 ModuleNotFoundError: No module named 'mysum'

执行结果如下

tests/test_func.py F                                                                                                                                                                          [100%]

======================================================= FAILURES ==============================================
_______________________________________________________ test_answer ___________________________________________

    def test_answer():
        data = [1, 2, 3]
    
>       assert sum(data) == 5
E       assert 6 == 5
E        +  where 6 = sum([1, 2, 3])

tests/test_func.py:11: AssertionError
=======================================================1 failed in 0.03 seconds =======================================================
复制代码

由于6!=5,这个单元测试提示了出错的位置。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Wikis For Dummies

Wikis For Dummies

Dan Woods、Peter Thoeny / For Dummies / 2007-7-23 / USD 24.99

Corporations have finally realized the value of collaboration tools for knowledge sharing and Wiki is the open source technology for creating collaborative Web sites, as either a public site on the In......一起来看看 《Wikis For Dummies》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具