zoukankan      html  css  js  c++  java
  • unittest 单元测试

    unittest 单元测试:

        1,单元测试是指对软件中最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来讲,要根据实际情况去判定其具体含义。

        2,unitest=TestCase + TestResult  执行 + 结果

        3,首先使用import unitest

        4,测试的类都是继承于TestCase类

        5, setUp()测试前的初始化工作;tearDown()测试后的清除工作(在每个测试方法运行时被调用)

        注意:

             1,所有类中方法入参为self,定义方法的变量也要“self.变量”(熟悉python的写法其实就是类变量的调用)

             2,定义测试用例,以“test”开头命名的方法,方法的入参为self

             3,unitest.main()方法会搜索该模块下所有的以test开头的测试用例方法,并且自动执行它们

             4,成功会输出,失败是F

    先看一个例子:

    # -*- coding:UTF-8 -*-
    __autor__ = 'zhouli'
    __date__ = '2018/11/7 21:15'
    
    import unittest
    
    
    class UserTestCase(unittest.TestCase):
        def setUp(self):
            print("--setup--")
    
        def tearDown(self):
            print("--tearDown--")
    
        def test_name(self):
            print('--name--')
    
    
    if __name__ == '__main__':
        unittest.main()

    运行的结果为:

    .
    --setup--
    ----------------------------------------------------------------------
    --name--
    Ran 1 test in 0.000s
    --tearDown--
    
    OK

    可以看到的顺序是先执行setup方法之后,再去执行自定义的测试方法,最终使用tearDown来进行收尾

    再看补充,因为在unitest中必须以test_开头来定义方法,因此新增几个方法。

    # -*- coding:UTF-8 -*-
    __autor__ = 'zhouli'
    __date__ = '2018/11/7 21:15'
    
    import unittest
    
    
    class UserTestCase(unittest.TestCase):
        def setUp(self):
            print("--setup--")
    
        def tearDown(self):
            print("--tearDown--")
    
        def test_name(self):
            print('--name--')
    
        def test_isupper(self):
            print('--upper')
    
        def test_age(self):
            print('--age')
    
    
    if __name__ == '__main__':
        unittest.main()

    执行的结果为:

    --setup--
    ...
    --age
    ----------------------------------------------------------------------
    --tearDown--
    Ran 3 tests in 0.000s
    --setup--
    
    --upper
    OK
    --tearDown--
    --setup--
    --name--
    --tearDown--

    也就是说,每一个自定义方法开始会调用setup,然后调用自定义方法,然后调用tearDown方法

    # -*- coding:UTF-8 -*-
    __autor__ = 'zhouli'
    __date__ = '2018/11/7 21:15'
    
    import unittest
    
    
    class UserTestCase(unittest.TestCase):
        def setUp(self):
            print("--setup--")
    
        def tearDown(self):
            print("--tearDown--")
    
        def test_name(self):
            self.assertEqual('foo'.upper(), "FoO", msg='转换不对')  # msg=是报错之后的提示信息
            print('--name--')
    
        def test_isupper(self):
            print('--upper')
    
        def test_age(self):
            print('--age')
    
    
    if __name__ == '__main__':
        unittest.main()

    结果如下:

    --setup--
    ..F
    --age
    ======================================================================
    --tearDown--
    FAIL: test_name (__main__.UserTestCase)
    --setup--
    ----------------------------------------------------------------------
    --upper
    Traceback (most recent call last):
    --tearDown--
      File "C:/Users/lenovo/Desktop/新建文件夹/自动化测试selenium/unitest_import.py", line 16, in test_name
    --setup--
        self.assertEqual('foo'.upper(), "FoO", msg='转换不对')  # msg=是报错之后的提示信息
    --tearDown--
    AssertionError: 'FOO' != 'FoO'
    - FOO
    ?  ^
    + FoO
    ?  ^
     : 转换不对
    
    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s
    
    FAILED (failures=1)

    三个test失败1个,报错信息为转换不对,总体结论为..F

     测试套件TestSuite介绍:

      需求:

         1,利用unitest执行流程测试而非单元测试

         2,控制unitest的执行顺序

    ① unitest.TestSuite()类来表示一个测试用例集

         1,用来确定测试用例的执行顺序,决定先后执行

         2,如果一个class中有四个test开头的方法,则加载到suite中则有四个测试用例

         3, 由TestLoder加载TestCase到TestSuite

         4, verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告

                默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F”

    ② TextTestRunner() 文本测试用例运行器

    ③ run()方法是运行测试套件的测试用例,入参为suite测试套件

    # -*- coding:UTF-8 -*-
    __autor__ = 'zhouli'
    __date__ = '2018/11/10 21:37'
    
    import unittest
    
    
    class UserTestCase(unittest.TestCase):
        def setUp(self):
            self.age = 25
            self.name = "呦西,开始了"
            print('setup method------')
    
        def tearDown(self):
            print("--tearDown method------")
    
        def test_one(self):
            print("test_one 周先生来了")
            self.assertEqual(self.name, "呦西,开始了", msg="口令不对!")
    
        def test_two(self):
            print('test_two')
            self.assertFalse("ZL".isupper(), msg="不是大写")
    
        def test_three(self):
            print('test_three')
            self.assertEqual(self.age, 25)
    
        def test_four(self):
            print('test_four')
            self.assertEqual(self.age, 25)
    
    
    if __name__ == '__main__':
        suite = unittest.TestSuite()
        suite.addTest(UserTestCase("test_one"))  # 测试类名加方法
        
        # verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告 默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F”
        runner = unittest.TextTestRunner(verbosity=0)
        runner.run(suite)

    运行结果如下:

    setup method------
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    test_one 周先生来了
    
    --tearDown method------
    OK

    如果增加多个呢?

        suite.addTest(UserTestCase("test_four"))
        suite.addTest(UserTestCase("test_two"))
        suite.addTest(UserTestCase("test_three"))

    注意顺序,这个是指定的顺序添加之后,结果如下:

    setup method------
    test_one 周先生来了
    --tearDown method------
    setup method------
    test_four
    --tearDown method------
    setup method------
    test_two
    --tearDown method------
    setup method------
    test_three
    --tearDown method------
    ----------------------------------------------------------------------
    Ran 4 tests in 0.001s
    
    OK

    完整代码如下:

    # -*- coding:UTF-8 -*-
    __autor__ = 'zhouli'
    __date__ = '2018/11/10 21:37'
    
    import unittest
    
    
    class UserTestCase(unittest.TestCase):
        def setUp(self):
            self.age = 25
            self.name = "呦西,开始了"
            print('setup method------')
    
        def tearDown(self):
            print("--tearDown method------")
    
        def test_one(self):
            print("test_one 周先生来了")
            self.assertEqual(self.name, "呦西,开始了", msg="口令不对!")
    
        def test_two(self):
            print('test_two')
            self.assertFalse("zl".isupper(), msg="不是大写")
    
        def test_three(self):
            print('test_three')
            self.assertEqual(self.age, 25)
    
        def test_four(self):
            print('test_four')
            self.assertEqual(self.age, 25)
    
    
    if __name__ == '__main__':
        suite = unittest.TestSuite()
        suite.addTest(UserTestCase("test_one"))  # 测试类名加方法
        suite.addTest(UserTestCase("test_four"))
        suite.addTest(UserTestCase("test_two"))
        suite.addTest(UserTestCase("test_three"))
    
        # verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告 默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F”
        runner = unittest.TextTestRunner(verbosity=2)
        runner.run(suite)
    没有过不去的坎,只有没加够的油!
  • 相关阅读:
    调接口
    500 Internal Server Error
    htaccess跨域
    Header add Access-Control-Allow-Origin: *
    如何写jquery插件
    笔记
    互联网思维,谁的思维?
    超强js博客值得学习!!!
    学好js的步骤
    NOIP2000 进制转换
  • 原文地址:https://www.cnblogs.com/zhoulixiansen/p/9926097.html
Copyright © 2011-2022 走看看