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)