Python中的单元测试 – Unittest
什么是单元测试?
单元测试是软件测试的第一级,其中测试软件的最小可测试部分。这用于验证软件的每个单元是否按设计执行。
unittest 测试框架是python的xUnit风格框架。
方法:
白盒测试方法用于单元测试。
unittest框架支持的OOP概念:
- 测试夹具:
测试夹具用作运行测试的基线,以确保有一个运行测试的固定环境,以便结果可重复。
例子 :- 创建临时数据库。
- 启动服务器进程。
- 测试用例:
测试用例是一组条件,用于确定被测系统是否正常工作。 - 测试套件:
测试套件是一组测试用例,用于测试软件程序,通过一起执行聚合测试来显示它具有某些特定的行为集。 - 测试运行器:
测试运行器是设置测试执行并向用户提供结果的组件。
基本测试结构:
unittest 通过以下两种方式定义测试:
- 使用代码管理测试“夹具”。
- 测试自己。
import unittest
class SimpleTest(unittest.TestCase):
# Returns True or False.
def test(self):
self.assertTrue(True)
if __name__ == '__main__':
unittest.main()
这是使用 unittest 框架的基本测试代码,它有一个单一的测试。如果 TRUE 为 FALSE,则此 test() 方法将失败。
运行测试
if __name__ == '__main__':
unittest.main()
最后一个块通过命令行运行文件来帮助运行测试。
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
在这里,在输出中的“。”输出的第一行表示测试通过。
在运行测试时在命令行中添加“-v”选项以获得更详细的测试结果。
test (__main__.SimpleTest) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
可能的结果:
有三种可能的测试结果:
- OK——这意味着所有的测试都通过了。
- FAIL – 这意味着测试没有通过并且引发了 AssertionError 异常。
- ERROR – 这意味着测试引发了 AssertionError 以外的异常。
让我们通过一个例子来了解unittest框架的实现。
执行 :
# Python code to demonstrate working of unittest
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self):
pass
# Returns True if the string contains 4 a.
def test_strings_a(self):
self.assertEqual( 'a'*4, 'aaaa')
# Returns True if the string is in upper case.
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
# Returns TRUE if the string is in uppercase
# else returns False.
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
# Returns true if the string is stripped and
# matches the given output.
def test_strip(self):
s = 'geeksforgeeks'
self.assertEqual(s.strip('geek'), 'sforgeeks')
# Returns true if the string splits and matches
# the given output.
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
上面的代码是一个测试 5 个字符串方法的简短脚本。 unittest.TestCase用于通过子类化来创建测试用例。底部的最后一段代码允许我们通过运行文件来运行所有的测试。
代码中使用的基本术语:
- assertEqual() -此语句用于检查获得的结果是否等于预期结果。
- assertTrue() / assertFalse() –此语句用于验证给定语句是真还是假。
- assertRaises() –此语句用于引发特定异常。
测试说明:
- test_strings_a
此测试用于测试字符串的属性,其中字符“a”乘以数字“x”给出x乘以“a”的输出。在这种情况下,如果结果与给定输出匹配,则 assertEqual() 语句将返回 true。 - test_upper
此测试用于检查给定字符串是否转换为大写。如果返回的字符串为大写,则 assertEqual() 语句返回 true。 - test_isupper
此测试用于测试字符串的属性,如果字符串为大写则返回 TRUE,否则返回 False。 assertTrue() / assertFalse() 语句用于此验证。 - 测试条
此测试用于检查函数中传递的所有字符是否已从字符串中删除。如果字符串被剥离并匹配给定的输出,则 assertEqual() 语句返回 true。 - test_split
该测试用于检查字符串的拆分函数,该函数通过函数中传递的参数拆分字符串,并将结果作为列表返回。在这种情况下,如果结果与给定输出匹配,则 assertEqual() 语句将返回 true。
unittest.main()为测试脚本提供了一个命令行界面。从命令行运行上述脚本时,会产生以下输出:
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK