单元测试框架(unittest)

单元测试框架(unittest)

  接口测试的本质:通过数据驱动测试类里面的函数 

  单元测试的本质:通过代码级别测试函数

  单元测试框架:unittest,pytest

  unittest类功能

    写用例:TestCase类 这个类的实例们是一个个独立的用例

    加载并执行用例:

      TestSuite类:存储用例

      TestLoader类:找用例,加载用例,存到TestSuite中

      TestRunner类:执行用例

    断言,对比实际结果和期望结果:

       判定用例是否通过 断言 Assert

    测试报告:TextTestRunner类

  例子:

import unittest

class Demo:
    def add(self,a,b):
        return a+b

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

class TestDemo(unittest.TestCase):# 继承unittest里面的TestCase类
    """编写测试用例,一个用例就是一个函数,函数不能传参,只有self关键字
    所有的用例/函数,都是test开头,test_"""
    def test_demo1(self):
        res = Demo().add(1, 1)
        print('1+1=', res)

    def test_demo2(self):
        res = Demo().add(-1, -1)
        print('-1+-1=', res)

if __name__ == '__main__':
    unittest.main() #自测,自动收集当前文件中所有的测试用例来执行

  执行结果:.代表成功 E代码出错 F用例没过,失败了

  执行排序:根据ASCII编码排序 abcd.......xyz

  TestSuite类  

import unittest
from base import basic

class Demo:
    def add(self,a,b):
        return a+b

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

class TestDemo(unittest.TestCase):
    def test_demo1(self):
        res = Demo().add(1, 1)
        print('1+1=', res)

    def test_demo2(self):
        res = Demo().add(-1, -1)
        print('-1+-1=', res)

if __name__ == '__main__':
    suite = unittest.TestSuite() #存储用例
    #方法一:一个个用例/函数添加
    # suite.addTest(TestDemo('test_demo1')) #创建测试类的实例,参数是test名称
    # suite.addTest(TestDemo('test_demo2'))
    # runner = unittest.TextTestRunner()#执行
    # runner.run(suite)
    #方法二.1:TestLoader类
    # loader = unittest.TestLoader() #创建一个加载器实例
    # suite.addTest(loader.loadTestsFromTestCase(TestDemo))#具体到类
    # runner = unittest.TextTestRunner()
    # runner.run(suite)
    #方法二.2:TestLoader类
    loader = unittest.TestLoader()
    suite.addTest(loader.loadTestsFromModule(basic)) #具体到模块
    runner = unittest.TextTestRunner()
    runner.run(suite)

    *实例化一个类要不要传参数是根据什么决定的?初始化函数

  断言:判断期望值与实际值的比对结果 一致通过 不一致失败    

import unittest

class Demo:
    def add(self,a,b):
        return a+b

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

class TestDemo(unittest.TestCase):
    def test_demo1(self):
        res = Demo().add(1, 1)
        print('1+1=', res)
        # self.assertEqual(2,res,'计算错误')
        self.assertIsNone(res)

    def test_demo2(self):
        res = Demo().add(-1, -1)
        print('-1+-1=', res)
        # self.assertTrue(res)
        self.assertIn(res,[1,2,-2])

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

    self.assertEqual(期望值,结果值,断言失败可以抛出的错)

    self.assertTure(x) bool(x) is True

    self.assertIsNone(x) x is None

    self.assertIn(a,b) a in b

  执行 上下文管理器,使用完成后自动关闭文件,避免忘记关闭文件的情况

    with open('test.txt','w+',encoding='UTF-8') as file:

      runner = unittest.TextTestRunner(stream=file,verbosity=0/1/2) 2是最详细的

      runner.run(suite)

    HTMLTestRunner类:测试报告

    import HTMLTestRunner

      with open('test_report.html','wb') as file:

        runner = HTMLTestRunner.HTMLTestRunner(stream=file,verbosity=0/1/2

              title='xx',description='xx',tester='xx') 2是最详细的

        runner.run(suite)

  单元测试内断言加异常处理

    try:

      self.assertEqual(-2,res,'报错')

    except AssertionError as e:

      print('xxxx{}'.format(e))

      raise e 异常处理完成后记得要抛出异常

  单元测试框架unittest内setUp和tearDown函数

    def setUp(self):

      每一条用例执行前执行

    def tearDown(self):

      每一条用例执行后执行

posted @ 2022-07-13 15:55  Lucky-qq  阅读(153)  评论(0编辑  收藏  举报