Unittest测试框架(学习总结分享1)

1、四个概念

1.1、测试固件(test fixture)

        1、常见的测试固件:

            1.1、setUp、tearDown:每个用例执行前或之后执行;可来做测试前的初始化工作和测试后的清理工作;

            1.2、setUpClass、tearDownClass:在类执行前或之后执行;

1.2、测试用例(test case)

        1、测试用例是在unittest中执行测试的最小单元;

        2、Unittest中测试用例的方法必须以test开头,并且执行顺序依据方法名的ASCII值来排序;

1.3、测试套件(test suite)

         1、测试套件就是一组测试用例,执行这个套件就可以执行这个套件下的所有测试用例;

1.4、测试运行器(test runner)

        1、测试运行器用来执行测试用例,并返回测试用例执行的结果;

        2、它还可以用图形、表格、文本等方式把测试结果形象的展示出来,如HTMLTestRunner;

1.5、Unittest用例示例

        1.1、示例代码:

import unittest

class TestStorm(unittest.TestCase):

    def setUp(self):
        print("setUp")

    def test_first(self):
        self.assertAlmostEqual('storm', 'storm')
        print("10")

    def tearDown(self):
        print("tearDown")

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

     1.2、执行结果:

  

1.6、总结

     1、 测试类必须继承unittest.TestCase;

     2、setUp和tearDown注意大小写;

     3、测试用例以“test_”开头;

     4、self.assertXXX是unittest提供的断言方法;

     5、setUp和tearDown的位置不影响其执行的顺序;

1.7、测试执行结果打印总结

     1、第1行显示测试开始执行的时间;

     2、第2行显示测试执行的文件;

     3、第3行显示执行一个测试用例花费了多长时间;

     4、OK表示断言成功;

     5、“setUp”和“tearDown”为程序执行输出的信息;

2、测试固件

2.1、测试固件简介

     1、setUp:在每个测试方法前执行,负责测试前的初始化工作;

     2、tearDown:在每个测试方法后执行,负责测试前的清理工作;

   3、setUpClass:在所有测试方法执行前执行,负责单元测试前期准备。必须使用@classmethod装饰器进行修饰,在setUp函数之前执行,在整个测试过程中只执行一次;

   4、tearDownClass:在所有测试方法执行后执行,负责单元测试前期准备。必须使用@classmethod装饰器进行修饰,在tearDown函数之后执行,在整个测试过程中只执行一次;

    5、测试固件本省就是一个函数,和测试用例分别负责不同的工作;

2.2、用例示例

import unittest


class TestStorm(unittest.TestCase):
    @classmethod    # 注意必须有该装饰器
    def setUpClass(cls):  # 在整个class开始前执行1次
        print("setUpClass")

    def setUp(self):   # 在每个测试用例前执行1次
        print("setUp")

    def test_1(self):   # 第一个测试用例
        print("first")
        self.assertEqual("first", "first")

    def test_2(self):   # 第二个测试用例
        print("second")
        self.assertEqual("second", "second")

    def tearDown(self):   # 在每个测试用例后执行1次
        print("teardown")

    @classmethod
    def tearDownClass(cls):  # 在整个class后执行1次
        print("tearDownClass")

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

    执行结果:

3、通过class构造测试集

3.1、第一种(两个class不在同一个py文件里)

       1、目录demo下有两个测试文件demo1.py和demo3.py,把两个文件的测试用例整合到一个测试用例集中执行;

       2、demo1.py文件内容:

import unittest

class TestStorm(unittest.TestCase):

    def setUp(self):
        print("setUp")

    def test_first(self):
        self.assertAlmostEqual('storm', 'storm')
        print("10")

    def tearDown(self):
        print("tearDown")

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

     3、demo3.py文件内容

import unittest


first = 20
class TestStorm(unittest.TestCase):

    def setUp(self):   # 在每个测试用例前执行1次
        print("setUp")

    def test_1(self):
        second = first + 5
        print(second)
        self.assertEqual(second, 25)

    def test_2(self):
        second = first + 10
        print(second)
        self.assertEqual(second, 30)

    def test_3(self):
        second = first + 20
        print(second)
        self.assertEqual(second, 40)

    def tearDown(self):   # 在每个测试用例后执行1次
        print("teardown")

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

       4、 整合测试用例集

# 通过class构造测试集

import unittest
from Demo import demo3
from Demo import demo1


if __name__ == '__main__':
    testcase1 = unittest.TestLoader().loadTestsFromTestCase(demo3.TestStorm)
    testcase2 = unittest.TestLoader().loadTestsFromTestCase(demo1.TestStorm)
    suite = unittest.TestSuite([testcase1, testcase2])
    unittest.TextTestRunner().run(suite)

   5、测试用例集执行结果:

3.2、第二种(两个class在同一个py文件里)        

        1、两个class在同一个py文件里;

        2、代码如下:

import unittest

first = 20
class TestStorm1(unittest.TestCase):

    def setUp(self):
        # print("setUp")
        pass

    def test_first(self):
        self.assertAlmostEqual('storm', 'storm')
        print("10")

    def tearDown(self):
        # print("tearDown")
        pass

class TestStorm2(unittest.TestCase):
    def setUp(self):   # 在每个测试用例前执行1次
        # print("setUp")
        pass

    def test_1(self):
        second = first + 5
        print(second)
        self.assertEqual(second, 25)

    def test_2(self):
        second = first + 10
        print(second)
        self.assertEqual(second, 30)

    def tearDown(self):   # 在每个测试用例后执行1次
        # print("teardown")
        pass

if __name__ == '__main__':
     testcase = unittest.TestLoader().loadTestsFromTestCase(TestStorm2, TestStorm1)
     suite = unittest.TestSuite([testcase])
     unittest.TextTestRunner().run(suite)

     3、执行结果如下:

4、通过addTest构建测试函数

       1、我们可以通过addTest将某个class下的测试用例添加到集合,然后执行测试集合;

       2、将demo目录下的demo3.py文件里的class里test_1和test_3用例添加的集合里,样例代码:

            2.1、demo3.py文件如下:

import unittest


first = 20
class TestStorm(unittest.TestCase):
    def setUp(self):   # 在每个测试用例前执行1次
        print("setUp")

    def test_1(self):
        second = first + 5
        print(second)
        self.assertEqual(second, 25)

    def test_2(self):
        second = first + 10
        print(second)
        self.assertEqual(second, 30)

    def test_3(self):
        second = first + 20
        print(second)
        self.assertEqual(second, 40)

    def tearDown(self):   # 在每个测试用例后执行1次
        print("teardown")

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

       2.2、构建测试集合代码文件,如下:

import unittest
from Demo import demo3


if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(demo3.TestStorm("test_1"))
    suite.addTest(demo3.TestStorm("test_3"))
    unittest.TextTestRunner().run(suite)

      2.3、执行结果如下:

5、通过discover构建测试集合

       1、我们可以通过unittest.TestLoader().discover(‘.’)在指定目录中寻找符合条件的测试用例,从而组成测试集合;

      2、创建目录demo2;在目录里创建测试文件test_1.py和test_2.py(以test开头的测试文件)

            目录及文件如下:

                 

        3、test_1.py文件代码:

import unittest

class Test_1(unittest.TestCase):

    def setUp(self):
        print("数据初始化")

    def tearDown(self):
        print("用例执行完后,数据清理")

    def test_01(self):
        print("测试用例:1")

    def test_02(self):
        print("测试用例:2")

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

     4、test_2.py文件代码:           

import unittest


class Test_1(unittest.TestCase):

    def setUp(self):
        print("数据初始化")

    def tearDown(self):
        print("用例执行完后,数据清理")

    def test_a(self):
        print("测试用例:a")

    def test_b(self):
        print("测试用例:b")


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

         5、在demo2同一级目录,或自定义目录里创建批量执行测试文件的py文件;

                例:创建文件:run_all_test.py

import unittest

if __name__ == '__main__':
    testsuite = unittest.TestLoader().discover('./demo2')  # 里面填写测试文件所在的路径
    unittest.TextTestRunner().run(testsuite)

             6、执行结果:

 

           7、也可在终端中到存放测试文件的目录下执行命令行的方式,达到相同的结果;

                    ​​​​​​​​​​​​​​

6、用例执行次序

       1、是测试用例能够按顺序执行;

       2、将Demo目录里的demo5例的测试用例按指定顺序执行,样例代码如下:

              2.1、demo5文件

import unittest

first = 20
class TestStorm1(unittest.TestCase):

    def setUp(self):
        # print("setUp")
        pass

    def test_1(self):
        self.assertAlmostEqual('storm', 'storm')
        print("10")

    def test_2(self):
        self.assertAlmostEqual('storm', 'storm')
        print("150")

    def tearDown(self):
        # print("tearDown")
        pass

class TestStorm2(unittest.TestCase):
    def setUp(self):   # 在每个测试用例前执行1次
        # print("setUp")
        pass

    def test_1(self):
        second = first + 5
        print(second)
        self.assertEqual(second, 25)

    def test_2(self):
        second = first + 10
        print(second)
        self.assertEqual(second, 30)

    def tearDown(self):   # 在每个测试用例后执行1次
        # print("teardown")
        pass

if __name__ == '__main__':
    # testcase = unittest.TestLoader().loadTestsFromTestCase(TestStorm2, TestStorm1)
    # suite = unittest.TestSuite([testcase])
    # unittest.TextTestRunner().run(suite)
    unittest.main()

             2.2、整合代码:

import unittest
from Demo import demo5


if __name__ == '__main__':
    # 按TestStorm2的test_2、test_1,TestStorm1的test_2、test_1顺序执行
    suite = unittest.TestSuite()
    suite.addTest(demo5.TestStorm2("test_2"))
    suite.addTest(demo5.TestStorm2("test_1"))
    suite.addTest(demo5.TestStorm1("test_2"))
    suite.addTest(demo5.TestStorm1("test_1"))
    unittest.TextTestRunner().run(suite)

           2.3、执行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小趴菜A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值