📜  Python中的单元测试 – Unittest

📅  最后修改于: 2022-05-13 01:54:40.593000             🧑  作者: Mango

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