python单元测试框架unittest

 

概念:

1.Test Case

一个Test Case的实例就是一个测试用例。

2.Test Suite

测试套件Test Suite用来组装单个测试用例。

3.Test Runner

通过TextTestRunner类提供run()方法执行test case/test suite。

4.Test Fixture

一个测试用例环境的搭建和销毁,就是一个fixture。通过setUp()和tearDown()方法实现。

 

例子:

calculator.py

#定义一个Count类,add()方法做两个整数相加,sub()方法做两个整数相减
class Count:
    def __init__(self, a, b):
        self.a = int(a)
        self.b = int(b)

    def add(self):
        return self.a + self.b

    def sub(self):
        return  self.a -self.b

 testadd.py

from calculator import Count
import unittest

#导入unittest模块,创建TesAdd类继承unittest的TestCase类
class TestAdd(unittest.TestCase):
    #setUp()方法用于测试用例执行前的初始化工作
    def setUp(self):
        print("test case start")

    def test_add(self):
        j = Count(1, 2)
        self.assertEqual(j.add(), 3)
        #assertEqual()方法进行断言,判断是否相等

    def test_add2(self):
        j = Count(10, 11)
        self.assertEqual(j.add(), 21)

    #tearDown()方法用于测试用例执行后的工作
    def tearDown(self):
        print("test case end")

if __name__ == "__main__":
    unittest.main()
    #main()方法,将一个单元测试模块变成可以直接运行的测试脚本

testsub.py

from calculator import Count
import unittest


class TestSub(unittest.TestCase):
    def setUp(self):
        print("test case start")

    def test_sub(self):
        j = Count(1, 2)
        self.assertEqual(j.sub(), -1)

    def test_sub2(self):
        j = Count(11, 10)
        self.assertEqual(j.sub(), 1)

    def tearDown(self):
        print("test case end")


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

runtest.py

import unittest
import testadd
import testsub

#TestSuite()类来创建测试套件,构造测试集
suite = unittest.TestSuite()

#addTest()方法添加测试用例
suite.addTest(testadd.TestAdd("test_add"))
suite.addTest(testadd.TestAdd("test_add2"))

suite.addTest(testsub.TestSub("test_sub"))
suite.addTest(testsub.TestSub("test_sub2"))

if __name__ == "__main__":
    #调用TextTestRunner()类下面的run()方法运行suite所组装的测试用例
    runner = unittest.TextTestRunner()
    runner.run(suite)

runtest_discover.py

import unittest

test_dir = "./"
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
#TestLoader类中discover()方法自动识别测试用例,避免使用addTest()操作麻烦

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(discover)
unittest相关类和方法
方法作用
TestCasesetUp()用于测试用例执行前的初始化工作。
tearDown()用于测试用例执行后的善后工作,为下一个test case留下一个干净的环境。
assertEqual()断言,判断是否相等。
 
TestLoaderdiscover()

discover(start_dir, pattern='test*.py', top_level_dir=None).

自动根据测试目录(test_dir)匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中。

 
TestSuiteaddTest()添加测试用例。
 
TextTestRunnerrun()运行测试用例。
 
 main()unittest全局方法,将一个单元测试模块变成可以直接运行的测试脚本,并自动执行它们。
断言方法
方法检查说明版本
assertEqual(a, b)a == b

assertEqual(firse, second, msg=None)

断言第一个参数和第二个参数是否相等,如果不相等测试失败。msg可选参数,用于定义测试失败打印信息。

 
assertNotEqual(a, b)a != b

assertNotEqual(firse, second, msg=None)

断言第一个参数与第二个参数是否不相等,如果相等测试失败。

 
assertTrue(x)bool(x) is True

assertTrue(expr, msg=None)

断言测试表达式为true,测试通过。否则失败。

 
assertFalse(x)bool(x) is False

assertFalse(expr, msg=None)

断言测试表达式为false,测试通过。否则失败

 
assertIs(a, b)a is b

assertIs(first, second, msg=None)

断言第一个参数和第二个参数是否为同一个对象。是则测试通过。

3.1
assertIsNot(a, b)a is not b 

assertIsNot(first, second, msg=None)

断言第一个参数和第二个参数是否为同一个对象。不是则测试通过。

3.1
assertIsNone(x)x is None

assertNone(expr, msg=None)

断言表达式是否为None对象。是则测试通过。

3.1
assertIsNotNone(x)x is not None

assertNotNone(expr, msg=None)

断言表达式是否为None对象。不是则测试通过。

3.1
assertIn(a, b)a in b

assertIn(first, second, msg=None)

断言第一个参数是否在第二个参数中,即第二个参数是否包含第一个参数。包含则测试通过。

3.1
assertNotIn(a, b)a not in b

assertNotIn(first, second, msg=None)

断言第一个参数是否在第二个参数中,即第二个参数是否包含第一个参数。不包含则测试通过。

3.1
assertInstance(a, b)isinstance(a, b)

assertInstance(obj, cls, msg=None)

断言obj是否为cls的一个实例。是则测试通过。

3.2
assertNotInstance(a, b)not isinstance(a, b)

assertNotInstance(obj, cls, msg=None)

断言obj是否为cls的一个实例。不是则测试通过。

3.2
测试用例装饰方法
方法说明
unittest.skip(reason)无条件地跳过装饰的测试,说明跳过测试的原因。
unittest.skipIf(condition, reason)条件为真时,跳过装饰的测试
unittest.skipUnless(condition, reason)条件为真时,执行测试,其他时候都跳过测试。
unittest.expectedFailure()测试标记为失败。不管测试结果是否失败,统一标记为失败。

例子:

decorator.py

import unittest

class MyTest(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass

    @unittest.skip("直接跳过测试")
    def test_skip(self):
        print("test 1")

    @unittest.skipIf(2 > 1, "当条件为真时跳过测试")
    def test_skip_if(self):
        print("test 2")

    @unittest.skipUnless(2 > 1, "当条件为真时执行测试")
    def test_skip_unless(self):
        print("test 3")

     #不管结果如何,标记为失败
    @unittest.expectedFailure
    def test_expected_Failure(self):
        self.assertEqual(1, 2)
if __name__ == "__main__":
    unittest.main()

结果:

说明:点(.)代表用例执行通过;F表示用例执行失败;E表示用例执行出错;S表示跳过执行用例。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值