单元测试Unittest框架的基本使用方法

发表于:2021-8-17 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小菠萝测试笔记    来源:掘金

  unittest简单介绍
  · 单元测试框架
  · 还可以适用WEB自动化测试用例的开发与执行
  · 提供丰富的断言方法
  · 官方文档:docs.python.org/zh-cn/3/lib…
  unittest基础使用
   # 导入unittest模块
   import unittest
   
   
   # 创建单元测试类,继承unittest.TestCase
   class testCase(unittest.TestCase):
   
       def setUp(self):
           print("case执行前")
   
       def tearDown(self):
           print("case执行后")
   
       @classmethod
       def setUpClass(cls):
          print("对象执行前")
   
       @classmethod
       def tearDownClass(cls):
           print("对象执行后")
   
       # 测试用例
       def test_01(self):
           print("test01")
   
       def test_02(self):
           print("test02")
   
   
   if __name__ == '__main__':
       unittest.main()
  运行结果:
    对象执行前
    case执行前
    test01
    case执行后
    case执行前
    test02
    case执行后
    对象执行后


   Ran 2 tests in 0.002s
 
   OK
  这里包含的知识点:
  unittest.Testcase
  自己创建的单元测试类都要继承它,它是所有单元测试类的基类。
  setUp
  · 用于每个测试用例执行前的初始化工作
  · 所有类中方法的入参为?self?,定义实例变量也要?self.变量
  tearDown
  每个测试用例执行后的都会执行此方法。
  setUpClass
  · 每个单元测试类运行前调用该方法,只会执行一次
  · 属于类方法,需要加上装饰器?@classmethod?
  · 默认入参是?cls?,指的就是“类对象”本身,其实和self没什么区别,用法一致
  tearDownClass
  · 每个单元测试类运行后调用该方法,只会执行一次
  · 属于类方法,需要加上装饰器?@classmethod?
  测试用例
  · 必须以“test_”开头命名的方法,否则无法识别并执行
  · 方法里面需要有断言,才能在最后运行时有该用例的执行结果
  · 可包含多个测试用例
  unittest.main()
  · 运行单元测试
  · 该命令会搜索当前module?下所有以 test开头的测试用例,并运行它们
  · 执行顺序是按照case的命名
  unitteest提供的各种断言方式
   class testCase(unittest.TestCase):
   
       def test_03(self):
           # 断言 - 是否为True
           flag = True
           self.assertTrue(flag, msg="测试失败的信息,可不填")
   
       def test_04(self):
           # 断言 - 是否为False
           flag = False
           self.assertFalse(flag)
   
       def test_05(self):
           # 断言 - 提供的两个参数是否相同(任意类型)
           self.assertEqual("123", "123")  # 字符串
           self.assertEqual({"a": 1}, {"a": 1})  # 字典
           self.assertEqual([1, 2], [1, 2])  # 列表
          self.assertEqual((1, 2), (1, 2))  # 元组
           self.assertEqual({1, 2}, {1, 2})  # 集合
   
       def test_06(self):
           # 断言 - 列表是否相同
           self.assertListtEqual([1, 2], [1, 2])
   
       def test_07(self):
           # 断言 - 字典是否相同
          self.assertDictEqual({"a": 1}, {"a": 1})
   
       def test_08(self):
           # 断言 - 元组是否相同
           self.assertTupleEqual((1, 2), (1, 2))
   
       def test_09(self):
           # 断言 - 集合是否相同
           self.assertSetEqual({1, 2}, {1, 2})
  这是比较常见的断言方式,当然还有一些比较容易理解的断言方式就没有一一举例啦,具体可以看看下面列表:
  unittest测试用例跳过执行
   class testCase(unittest.TestCase):
   
       # 直接跳过
       @unittest.skip("直接跳过")
       def test_skip(self):
           self.fail("shouldn't happen")
   
       # 满足condition则跳过
       @unittest.skipIf(1 < 2, "满足condition则跳过")
       def test_skipIf(self):
           print("skip if")
   
       # 不满足condition则跳过
       @unittest.skipUnless(sys.platform.startswith("win"), "需要window平台才不会跳过")
       def test_skipUnless(self):
           print("skip Unless")
   
       # 预计该测试用例会测试失败
       @unittest.expectedFailure
       def test_fail(self):
           self.assertEqual(1, 0, "broken")
   
       # 方法体内跳出不执行case
       def test_maybe_skipped(self):
           if True:
               self.skipTest("调用unittest的skipTest,在方法体内满足某些条件则跳过该case")
           pass
  运行结果
   Skipped: 调用unittest的skipTest,在方法体内满足某些条件则跳过该case
    
   Skipped: 直接跳过
    
   Skipped: 满足condition则跳过
   skip Unless
   
   
   Ran 5 tests in 0.010s
   
   OK (skipped=3, expected failures=1)
  跳过执行测试用例共有四种写法
  · @unittest.skip(reason)?:跳过测试用例,reason ?为测试被跳过的原因
  · @unittest.skipIf(condition, reason)?:当?condition?为真时,跳过测试用例。
   ·@unittest.skipUnless(condition, reason)?:跳过测试用例,除非?condition?为真
  · @unittest.expectedFailure?:把测试用例标记为预计失败;如果测试不通过,会被认为测试成功;如果测试通过了,则被认为是测试失败
  self.skipTest(reason)
  在方法体内满足某些条件下才跳过执行该测试用例。
  跳过执行测试用例注意点
  · 被跳过的测试的 ?setUp()?和??tearDown()? 不会被运行
  · 只输入?unittest.skip?,也可以正常跳过,不必写reason
  · 若输入?unittest.skip()?,括号内必须写reason,不得为空
  · 可以针对单元测试类级别设置跳过执行(在class声明上面直接加装饰器即可),该单元测试类所有测试用例不会被执行
  · 被跳过的类的?setUpClass()?和?tearDownClass()?不会被运行
  · 当方法体内调用了?self.skipTest(reason)?方法,该测试用例还是会调用?setUp()?和?tearDown()

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号