使用unittest进行单元测试(一)

 

这个写的比我写的好多了。别看我的了,看这个:https://huilansame.github.io/huilansame.github.io/archivers/python-unittest

 


导言

官方文档(针对python2.7):https://docs.python.org/2/library/unittest.html

单元测试的概念和经验:https://www.zhihu.com/question/27313846

 

好的单元测试工具可以提高你的开发效率。由于项目是用python语言写的,因此我选择了python的unittest来进行单元测试工作。下面先简单介绍一下unittest的基本使用方法:

 


 

unittest的基本使用方法

 

 

第一篇——初识单元测试

 

aim:了解unittest最基本的使用方法。让testcase跑起来。

 

第一步——引入unittest包

如果希望使用unittest进行单元测试,首先需要引入unittest(python默认包含unittest包)

import unittest

 

第二步——写一个类,继承unittest.TestCase

import unittest


class test_try(unittest.TestCase):

 

第三步——写testcase

注意:需要被自动执行的测试方法要以test_作为前缀,这样,testcase才能够正确识别

import unittest


class test_try(unittest.TestCase):

    def test_try01(self):
        print("test01")

 

第四步——调用我们的unittest,使其能够运行

import unittest


class test_try(unittest.TestCase):

    def test_try01(self):
        print("test01")

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

 

执行一下:

使用unittest进行单元测试(一)_第1张图片

 

第一关,闯关成功!

 


第二篇——setUp和tearDown、setUpClass和tearDownClass

 

触发时间:

setUp方法——会在每个测试函数运行前运行

tearDown——每个测试函数运行完后执行

setUpClass——必须使用@classmethod 装饰器,所有test运行前运行一次

tearDownClass——必须使用@classmethod装饰器,所有test运行完后运行一次

 

作用:

setUp方法——可以在每个testcase执行之前实现一些初始化准备工作

tearDown——可以在每个testcase执行之后实现一些清理工作(比如把写到数据库中用于测试的数据清理掉)

 

例子:

#!/usr/bin/env python
# -*- coding: utf-8 -*i-

import os
import unittest

class test_try(unittest.TestCase):
   
    @classmethod
    def setUpClass(cls):
        print("类执行之前的方法")

    @classmethod
    def tearDownClass(cls):
        print("类执行之后的方法")

    def setUp(self):
        print("setUp")

    def test_try01(self):
        print("test01")
    
    def test_try02(self):
        print("test02")

    def tearDown(self):
        print("testDown")

使用unittest进行单元测试(一)_第2张图片

 

第二关,闯关成功!

 


第三篇——引入待测试的模块

 

引入的方法有两种

方法一:

用于单元测试的py文件与被测试的模块处于同一目录。即

使用unittest进行单元测试(一)_第3张图片

此时可以直接在单元测试的文件中引入待测试的模块

#testtt是类名
from imported_module  import testtt

 

方法二:

如果嫌弃同一个目录下py文件太多了,可以使用包管理方式——即将py文件放入一个文件夹中,并将文件夹中添加空文件“_init_.py”。在文件夹中创建 _init_.py, 将文件夹变成一个包。

这样便于进行文件管理,否则会造成同一个文件夹里存放了许多的py文件,不方面管理。即:

使用unittest进行单元测试(一)_第4张图片

引入模块的方式语句与方法一相同。

 

先展示一下待测试的模块(即imported_module.py文件中的内容)

#!/usr/bin/env python
# -*- coding: utf-8 -*i-

import os

class testtt():
    def run(self):
        a=5;
        b=5;
        return a/b

我们想验证一下函数run的运行结果是否是1.。于是,unittest_study.py中的内容如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*i-

import os
import unittest
from imported_module import testtt

class test_try(unittest.TestCase):

    def test_try01(self):
        #实例化testtt类
        run = testtt()
        self.assertEqual(run.run(), 1)
        

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

运行一下:

使用unittest进行单元测试(一)_第5张图片

测试成功了。运行的结果与预期一致。那么问题来了,assertEqual是什么?

assertEqual是unittest.TestCase中的一个函数,用于验证测试结果是否和预期相等。此时需要引入一个新朋友——断言

使用unittest进行单元测试(一)_第6张图片

 

 


第四篇——skip让你跳过不想测的东西

 

可以使用unitest.skip装饰器族跳过test method或者test class,这些装饰器包括:

  • ① @unittest.skip(reason):无条件跳过测试,reason描述为什么跳过测试
  • ② @unittest.skipif(conditition,reason):condititon为true时跳过测试
  • ③ @unittest.skipunless(condition,reason):condition不是true时跳过测试

 

在我们的例子中。可以在"test_"函数前面加上相应的装饰@unittest.skip('test_try02'),这样在运行的时候,会跳过该测试

class test_try(unittest.TestCase):

    def test_try01(self):
        print("test01")

    #通过unittest.skip跳过test_try02方法,不去执行该方法
    @unittest.skip('test_try02')
    def test_try02(self):
        print("test02")

运行结果中会显示出跳过了几个test函数。(即图中的skipped=1,说明跳过了一个test函数)

使用unittest进行单元测试(一)_第7张图片

 


第五篇——调用主函数,别在老用unittest.main()了

 

测试的各个testcase其实可以单独调用,想测哪个测哪个。

下面代码就分别测试了各个“test_”函数:

if __name__ == "__main__":

    #unittest.main()

    #另一种执行测试的方法。不走main方法
    #创建一个容器
    suite = unittest.TestSuite()
    #向容器中添加待测试的case,添加的形式——类名('case名')
    suite.addTest(test_try('test_try01'))
    suite.addTest(test_try('test_try02'))
    unittest.TextTestRunner().run(suite)

使用unittest进行单元测试(一)_第8张图片

 

 

就先写到这里吧~

下一篇会介绍如何在项目中使用unittest来进行单元测试。

 

 

 

你可能感兴趣的:(Python)