首页 > 技术文章 > python单元测试unittest

cathyg 2019-11-20 16:36 原文

单元测试说白了,就是通过写检验代码检查之前写的代码是否运行结果正确,python自带了unitest这个模块,可以用他来做单元测试

testcase  测试用例
testsuite  用例集合
testrunner  运行测试用例
testloader  查找测试用例

下面是一个简单的单元测试:

import unittest
def add(a,b):
    return a+b

class AddTest(unittest.TestCase):
    def test_normal(self):
        result = add(1,1)
        self.assertEqual(2,result)   #校验结果是否一致

    def test_error(self):
        result = add(1,1)
        self.assertEqual(1,result,'结果计算错误')

unittest.main()

生成测试报告,通过导入HTMLTestRunner模块,这个模块需要自己安装,我是将HTMLTestRunner.py文件存放在我所用的环境下的Lib文件下,如果测试用的是虚拟环境,则放在虚拟环境的下的Lib文件下也可以

虚拟环境:
pip install virtualenv   #安装虚拟环境

import unittest
import HTMLTestRunner

def add(a,b):
    return a+b

class AddTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):#所有用例执行之前执行它
        print('setUpClass')
    @classmethod
    def tearDownClass(cls):#所有用例执行之后执行它
        print('tearDownClass')

    def setUp(self):
        print('setUp')
        #每条用例执行之前都会执行它
    def tearDown(self):
        print('tearDown')
        #每条用例执行之后都会执行它

    def test_normal(self):
        result = add(1,1)
        self.assertEqual(2,result)
        print('test_normal')

    def test_error(self):
        print('test_error')
        result = add(1,1)
        self.assertEqual(1,result,'结果计算错误')

#htmltestruner产生测试报告
test_suite = unittest.makeSuite(AddTest)
file = open('report.html','wb')
runner = HTMLTestRunner.HTMLTestRunner(file,title='测试报告')
runner.run(test_suite)
file.close()

生成报告

 

 

安装BeautifulReport模块,我是将BeautifulReport文件夹存放在我所用的环境下的Lib文件下site-packages目录下,如有虚拟环境,就放虚拟环境下

参数化要导入parameterized模块,使用pip install parameterized安装该模块

import parameterized
import unittest,BeautifulReport

data = [
    ['admin','123456',True,'正常登录'],    #这里传入信息如“正常登录”,用例描述则显示这个
    ['admin','1122',False,'冻结用户登录'],
    ['sdfsdf','1111',False,'黑名单用户登录']
]
data2 = [
    ['admin','123456',True],
    ['admin','1122',False],
    ['sdfsdf','1111',False]
]
def login(user,password):
    if user=='admin' and password=='123456':
        return True
    return False

class LoginTest(unittest.TestCase):

    @parameterized.parameterized.expand(data)
    def test_login(self,user,password,expect,desc):
        self._testMethodDoc = desc #自己指定
        result = login(user,password)
        self.assertEqual(expect,result)

    @parameterized.parameterized.expand(data2)
    def test_login2(self,user,password,expect):
        '''登录'''    #默认用例描述
        result = login(user,password)
        self.assertEqual(expect,result)

bf = BeautifulReport.BeautifulReport(unittest.makeSuite(LoginTest))
bf.report(filename='测试报告',description='接口测试报告')

多层目录如何查找测试用例,这个地方遇到个坑,没传top_lever_dir时,一直报错AssertionError: Path must be within the project,最后在以下这篇文章中找到解决方法

https://www.cnblogs.com/huwang-sun/p/11212158.html

import unittest,os

all_suite = unittest.TestSuite()
for cur_dir,dirs,files in os.walk('cases'):
    for dir in dirs:
        if not dir.startswith('__'):
            abs_path = os.path.join(cur_dir,dir)
            print(abs_path)
            test_suite = unittest.defaultTestLoader.discover(abs_path,pattern='*.py',top_level_dir='cases')
            all_suite.addTests(test_suite)
print(all_suite)

生成报告如下

 

 

 

推荐阅读