Python+selenium 【第七章】Unittest学习

  • Python+selenium 【第七章】Unittest学习
  unittest是python内置的单元测试框架,具备编写用例、组织用例、执行用例、功能,可以结合selenium进行UI自动化测试,也可以结合appium、requests等模块做其它自动化测试。
使用unittest前需要熟悉该框架的五个概念:
  testcase,testsuite,testLoader,testrunner,testfixture。
  
  1. testcase:一个完整的测试单元,执行该测试单元可以完成对某一个问题的验证,完整体现在测试前环境准备(setUp),执行测试代码(run),以及测试后环境还原(tearDown);
  2. testsuite:多个测试用例的集合,测试套件或测试计划;
  3. testLoader:加载TestCase到TestSuite中的,其中loadTestsFrom__()方法用于寻找TestCase,并创建它们的实例,然后添加到TestSuite中,返回TestSuite实例;
  4. testrunner:执行测试用例,并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息;
  5. testfixture:一个测试用例的初始化准备及环境还原,主要是setUp()和setDown()方法
 

unittest基本使用步骤:

  • a)用import语句引入unittest模块
  • b)让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合
  • c)setUp()方法中进行测试前的初始化工作,teardown()方法中执行测试后的清除工作,它们都是TestCase中的方法
  • d)编写测试的方法最好以test开头(可以直接运行)deftest_add(self)、deftest_sub(self)等,可以编写多个测试用例对被测对象进行测试
  • e)在编写测试方法过程中,使用TestCaseclass提供的方法测试功能点,比如:assertEqual等
  • f)调用unittest.main()方法运行所有以test开头的方法
 
 

unittest常用断言介绍:

断言即进行预期结果和实际结果比对。

assertEqual(a,b)  a==b  #是否相等

assertNotEqual(a,b)  a!=b  #是否不相等

assertTrue(x)    bool(x) is True #是否为True

assertFalse(x)   bool(x) is False #是否为False

assertIn(a,b)     a  in b #是否包含

assertGreater(a,b)  a>b  #大于

assertGreaterEqual(a,b)  a >= b #大于等于

assertLess(a,b)  a<b#小于

assertLessEqual(a,b)  a<=b #小于等于

可以在断言最后一个参数中加入自定义的测试失败信息,如:

assertEqual(10,20,”10!=20测试失败”) 当断言失败时,显示该消息。

 
  • 代码示例
 
  • unittest_demo_14.py
# -*- coding: utf-8 -*-
# @Time : 2021/12/30 14:24
# @Author : Limusen
# @File : unittest_demo_14


import unittest

class TestCase01(unittest.TestCase):

    def setUp(self) -> None:
        print("执行前置")

    def tearDown(self) -> None:
        print("执行后置信息")

    def test_case01(self):
        '''加法'''
        self.assertEqual(1 + 2, 3)

    def test_case02(self):
        self.assertEqual(1 + 2, 2)


if __name__ == "__main__":
    TestCase01().test_case01()
  • 代码示例

unittest_demo_15.py

# -*- coding: utf-8 -*-
# @Time : 2021/12/30 14:35
# @Author : Limusen
# @File : unittest_demo_15

#  断言练习

import time
import unittest


class TestCase02(unittest.TestCase):

    def setUp(self) -> None:
        # print("执行前置")
        pass

    def tearDown(self) -> None:
        # print("执行后置信息")
        pass

    def test_case01(self):
        a = 1 == 1
        self.assertTrue(a, '断言失败,不是True')

    # def test_case02(self):
    #     a =1 ==3
    #     self.assertTrue(a,'断言失败,不是True')

    def test_case03(self):
        str = "你有梦想吗"
        self.assertTrue(str.__contains__("梦想"))

    def test_case04(self):
        name = ['张三', '李四', '王五']
        self.assertIn('李四', name)
        print("范围测试")

    def test_case05(self):
        self.assertIsInstance('lishou', str)
        print("类型判定")


if __name__ == "__main__":
    unittest.main()
  • 改变代码执行顺序

demo_unittest_15.py

# -*- coding: utf-8 -*-
# @Time : 2021/12/30 14:35
# @Author : Limusen
# @File : unittest_demo_15


import unittest


class TestCase03(unittest.TestCase):

    def test_case01_aaa(self):
        print("执行用例:test_aaa")

    def test_case02_ddd(self):
        print("执行用例:test_ddd")

    def test_case03_ccc(self):
        print("执行用例:test_ccc")

    def test_case04_bbb(self):
        print("执行用例:test_bbb")


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

    # # 改变执行顺序方法
    # suite = unittest.TestSuite()
    # suite.addTest(TestCase03('test_bbb'))
    # suite.addTest(TestCase03('test_ccc'))
    # unittest.main(defaultTest='suite')
    pass

    # 改名字 test_case04_bbb
    unittest.main()
  • 是否跳过用例
# -*- coding: utf-8 -*-
# @Time : 2021/12/30 14:35
# @Author : Limusen
# @File : unittest_demo_15


import unittest


class TestCase04(unittest.TestCase):

    def test_case01(self):
        print("正在运算test_case01")
        self.assertEqual(3 + 4, 7, "求和失败")

    @unittest.skip("无条件跳过")
    def test_case02(self):
        print("正在运算test_case02")
        self.assertEqual(4 + 4, 8, "求和失败")

    @unittest.skipIf(True, '条件为真跳过')
    def test_case03(self):
        print("正在运算test_case03")
        self.assertEqual(4 + 4, 8, "求和失败")

    @unittest.skipIf(False, '条件为假不跳过')
    def test_case04(self):
        print("正在运算test_case04")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.skipUnless(False, '条件为假跳过')
    def test_case05(self):
        print("正在运算test_case05")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.expectedFailure  # 失败不记录失败数量
    def test_case06(self):
        print("正在运算test_case06")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.expectedFailure
    def test_case07(self):
        print("正在运算test_case07")
        self.assertEqual(4 + 4, 9, "求和失败")


if __name__ == "__main__":
    unittest.main()
  • 收集用例进行运行
# -*- coding: utf-8 -*-
# @Time : 2021/12/30 14:35
# @Author : Limusen
# @File : unittest_demo_15



import unittest


class TestCase05(unittest.TestCase):

    def test_case01(self):
        print("正在运算test_case01")
        self.assertEqual(3 + 4, 7, "求和失败")

    @unittest.skip("无条件跳过")
    def test_case02(self):
        print("正在运算test_case02")
        self.assertEqual(4 + 4, 8, "求和失败")

    @unittest.skipIf(True, '条件为真跳过')
    def test_case03(self):
        print("正在运算test_case03")
        self.assertEqual(4 + 4, 8, "求和失败")

    @unittest.skipIf(False, '条件为假不跳过')
    def test_case04(self):
        print("正在运算test_case04")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.skipUnless(False, '条件为假跳过')
    def test_case05(self):
        print("正在运算test_case05")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.expectedFailure  # 失败不记录失败数量
    def test_case06(self):
        print("正在运算test_case06")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.expectedFailure
    def test_case07(self):
        print("正在运算test_case07")
        self.assertEqual(4 + 4, 9, "求和失败")


if __name__ == "__main__":
    testsuite = unittest.TestSuite(unittest.makeSuite(TestCase05))
    unittest.main(defaultTest='testsuite')
  • 执行
# -*- coding: utf-8 -*-
# @Time : 2021/12/30 14:35
# @Author : Limusen
# @File : unittest_demo_19

import unittest


class TestCase06(unittest.TestCase):

    def test_case01(self):
        print("正在运算test_case01")
        self.assertEqual(3 + 4, 7, "求和失败")

    @unittest.skip("无条件跳过")
    def test_case02(self):
        '''无条件跳过'''
        print("正在运算test_case02")
        self.assertEqual(4 + 4, 8, "求和失败")

    @unittest.skipIf(True, '条件为真跳过')
    def test_case03(self):
        '''条件为真跳过'''
        print("正在运算test_case03")
        self.assertEqual(4 + 4, 8, "求和失败")

    # @unittest.skipIf(False, '条件为假不跳过')
    @unittest.skip("无条件跳过")
    def test_case04(self):
        '''无条件跳过'''
        print("正在运算test_case04")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.skipUnless(False, '条件为假跳过')
    def test_case05(self):
        '''条件为假跳过'''
        print("正在运算test_case05")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.expectedFailure  # 失败不记录失败数量
    def test_case06(self):
        print("正在运算test_case06")
        self.assertEqual(4 + 4, 9, "求和失败")

    @unittest.expectedFailure
    def test_case07(self):
        print("正在运算test_case07")
        self.assertEqual(4 + 4, 9, "求和失败")


if __name__ == "__main__":
    # # 方法一:加载测试类下面的所有用例
    # suite01 = unittest.TestLoader().loadTestsFromTestCase(TestCase06)
    # unittest.main(defaultTest='suite01')
    #
    # # 方法二:加载测试模块下面的所有用例
    # #  先导入模块 自己
    # suite02 = unittest.TestLoader().loadTestsFromModule(test_case6)
    # unittest.main(defaultTest="suite02")
    #
    # # 方法三:使用字符串的方式加载用例
    # suite03 = unittest.TestLoader().loadTestsFromName('test_case6.TestCase06.test_case01')
    # # 整个模块
    # suite04 = unittest.TestLoader().loadTestsFromName('test_case6.TestCase06')
    # suite05 = unittest.TestLoader().loadTestsFromName('test_case6')
    #
    # # 单个加载全部测试用例
    # all_suite = unittest.TestSuite()
    # all_suite.addTests(suite01)
    # all_suite.addTests(suite02)
    # all_suite.addTests(suite03)
    # all_suite.addTests(suite04)
    # all_suite.addTests(suite05)
    pass
原文地址:https://www.cnblogs.com/yushengaqingzhijiao/p/15748729.html