使用 unittest 框架对 Python 代码进行单元测试
作者:互联网
单元测试是软件开发的重要组成部分,因为它隔离软件程序或系统的不同组件,并检查其运行方式是否正确。它确保代码符合质量标准,并且系统中的缺陷或错误可以正确地追溯到失败的隔离代码单元,并及时纠正故障。
我的静态站点生成器 -rwar随着时间的推移不断发展并变得更好,这意味着我需要确保代码是专业和高质量的!此外,能够使用测试框架并很好地学习它们可以帮助您在面试中脱颖而出。
学习曲线
到目前为止,我不习惯为我从事的个人项目和小组项目编写测试,这就是为什么从测试驱动的角度思考代码对我来说具有挑战性。我能感觉到我的神经元在放电,因为我正在努力思考如何将所有的单元测试片段放在一起。到目前为止,我只有一点点使用JavaScript和Java测试框架的经验,所以我必须经历一个很大的学习曲线来理解框架。这个解释对于我了解什么是 unittest以及如何开始使用它非常有用。我曾经低估了阅读文档的重要性,但现在我知道这项技能是多么重要。Jest
Junit
unittest
为什么框架unittest
在对一些最流行的 Python 测试框架进行一些研究时,我遇到了,并且。它们都是很棒的工具,但是,我决定尝试这个项目,因为 unittest 的灵感来自我之前有一些经验。尝试和学习不同的框架以最终找出我们最喜欢的框架总是好的。我将为我的下一个Python项目进行尝试。每个测试框架都有其命名文件和结构化代码的约定,这是查看示例并浏览所选框架的文档的另一个重要原因。pytest
nose
unittest
unittest
JUnit
pytest
有一个好的测试计划
在开始之前有一个好的测试计划非常重要。
1) 了解你的代码做了什么
- 函数采用哪种输入
- 程序的功能是什么
- 预期输出是多少
2)好的和坏的测试场景
- 想想成功案例和异常案例。例如,如果您正在构建学校管理系统 - 添加同一学生两次应该会导致某种警告。
3) 什么不需要测试
- 不需要测试的一个很好的例子是来自外部包的功能。另一个示例是调用代码已测试的函数的程序。
4) 编写测试
- 然后,是测试写作部分!
- 例如,如果您正在构建学校管理系统 - 则可以测试添加学生、加载现有学生、添加同一学生两次等功能。
过程
对于我的项目,我在文件夹下创建了两个测试文件 - 和。test_parser.py
test_ssg.py
test
如本文档所述:
unittest
要求:
- 将测试作为方法放入类中
- 在类中使用一系列特殊的断言方法,而不是内置语句
unittest.TestCase
assert
1)要开始使用unittest,我首先必须:
import unittest
2)然后,我创建了一个从该类继承的类,它旨在测试我的SSGTest
TestCase
class SSG
class SSGTest(unittest.TestCase):
同样,我已经为我的另一个test_parser.py文件执行此操作。
class CLIParser(unittest.TestCase):
举个例子:
很难回顾我为我的项目编写的所有测试,因为有很多!但是,
这里有一个例子。请注意,我如何在测试中使用描述性名称。在这里,我正在检查测试是否有任何输入文件。test_parser.py
class CLIParser(unittest.TestCase):
def test_without_input(self):
with self.assertRaises(SystemExit) as err:
get_parser_args([])
self.assertEqual(err.exception.code, 2, "No input directory provided")
assertRaises()
验证是否引发特定异常。
with self.assertRaises(SomeException):
do_something()
assertEqual()
检查预期结果。
with self.assertRaises(SomeException) as cm:
do_something()
the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
何时使用 setUp() 和 tearDown()
如果你浏览我的代码,你会发现我使用了 theand方法。对于test_ssg.py中的每个测试,都会创建一个临时文件,该文件需要在测试后删除,这是我可以使用setUp()和tearDown()完成的。这些是重复的过程,我可以使用这些方法简化。想象一下,您有一个包含 10 个测试的套件,其中 7 个需要相同的设置/拆卸代码,而 3 个不需要,并为您提供了一种重构代码的好方法。当我们需要创建用于测试目的或模拟目的的假数据库时,通常会使用它。