51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3364|回复: 2
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 941 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-8-17 10:13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    unittest简单介绍
      · 单元测试框架
      · 还可以适用WEB自动化测试用例的开发与执行
      · 提供丰富的断言方法
      · 官方文档:docs.python.org/zh-cn/3/lib…
      unittest基础使用
    1. # 导入unittest模块
    2.    import unittest
    3.   
    4.   
    5.    # 创建单元测试类,继承unittest.TestCase
    6.    class testCase(unittest.TestCase):
    7.   
    8.        def setUp(self):
    9.            print("case执行前")
    10.   
    11.        def tearDown(self):
    12.            print("case执行后")
    13.   
    14.        @classmethod
    15.        def setUpClass(cls):
    16.           print("对象执行前")
    17.   
    18.        @classmethod
    19.        def tearDownClass(cls):
    20.            print("对象执行后")
    21.   
    22.        # 测试用例
    23.        def test_01(self):
    24.            print("test01")
    25.   
    26.        def test_02(self):
    27.            print("test02")
    28.   
    29.   
    30.    if __name__ == '__main__':
    31.        unittest.main()
    复制代码
    运行结果:
    1.   对象执行前
    2.     case执行前
    3.     test01
    4.     case执行后
    5.     case执行前
    6.     test02
    7.     case执行后
    8.     对象执行后


    9.    Ran 2 tests in 0.002s

    10.    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

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-3 14:36 , Processed in 0.067838 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表