python学习笔记:unittest单元测试

 

 

单元测试:开发自测时写的代码

unittest基本原理:

  ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用。

  ♦unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。

  几个概念:

  TestCase 也就是测试用例

  TestSuite 多个测试用例集合在一起

  TestLoader是用来加载TestCase到TestSuite中的

  TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

 

unitest的目录结构一般如下:重要

 unittest 测试

def cal(a,b):
    return a+b
#
# res = cal(1,9)
# if res == 3:
#     print('成功')
# else:
#     raise Exception('测试失败')

# unittest python中的单元测试框架
import unittest

class MyTest(unittest.TestCase):   #继承TestCase
    def test_a(self):   #函数的名字必须以test开头
        res = cal(1,2)
        self.assertEqual(3,res,msg='预期结果和实际结果不一致')

    def test_b(self):
        res = cal(9,3)
        self.assertEqual(3,res,msg='预期结果和实际结果不一致')

unittest.main()  #运行测试用例

 

unittest常用的断言
断言语法                          解释
assertEqual(a, b)        判断a==b
assertNotEqual(a, b)       判断a!=b
assertTrue(x)           bool(x) is True
assertFalse(x)            bool(x) is False
assertIs(a, b)           a is b
assertIsNot(a, b)              a is not b
assertIsNone(x)           x is None
assertIsNotNone(x)          x is not None
assertIn(a, b)              a in b
assertNotIn(a, b)         a not in b
assertIsInstance(a, b)       isinstance(a, b)
assertNotIsInstance(a, b)      not isinstance(a, b)

 

unittest 测试产生报告

两种生成测试报告的方式:

1、安装BeautifulReport模块

2、把HTMLTestRunner.py 放到pyCharm的External Libraries中

 

import unittest
import HTMLTestRunner
import BeautifulReport

class MyTest(unittest.TestCase):
    def test_reg(self):
        '''注册'''       #加这一行会在报告中显示用例描述
        print('reg')
        self.assertEqual(1,1)

    def test_log(self):
        '''登录'''
        print('log')
        self.assertEqual(1,1)

    def test_buy(self):
        self.assertEqual(1,2,msg='购买失败')

    def test_z(self):
        self.assertIn(1,[1,2,3])

    def test_assert(self):
        res = False
        self.assertFalse(res,)

#下面这一坨是用HTMLTestRunner,产生不好看的测试报告
f = open('report.html','wb')
runner = HTMLTestRunner.HTMLTestRunner(f,title='lhtest',description='XX接口测试')  #实例化一个runner,帮你跑测试用例
suit = unittest.makeSuite(MyTest)  #MyTest类变成测试集合
runner.run(suit)

#下面这一坨是用BeautifulReport,产生不好看的测试报告
suite = unittest.makeSuite(MyTest)   #变成测试集合
report = BeautifulReport.BeautifulReport(suite)
report.report(filename='bfreport.html',description='接口测试报告')

# 测试集合:testsuite  多个用例放在一起
# unittest  1、函数名必须是test开头,unittest才会帮你执行
#           2、用例运行的顺序是按照函数的首字母排序的,a-z
# testrunner  运行测试用例的
# testloader  查找测试用例的

如果我们有很多个模块,每个模块下面都写了很多python文件,每个python文件里面都有测试用例,那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的所有python文件,然后找到里面的测试用例,逐个执行,代码如下:

import unittest,HTMLTestRunner
        suite = unittest.TestSuite()#创建测试套件
        all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
        #找到某个目录下所有的以test开头的Python文件里面的测试用例
        for case in all_cases:
            suite.addTests(case)#把所有的测试用例添加进来
        fp = open('res.html','wb')
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况')
        runner.run(suite)
        #运行测试

 

参数化

安装nose-parameterized模块

import unittest
from parameterized import parameterized

def login(username,password):
    print(username,password)
    print('=============')
    return 1

class MyTest(unittest.TestCase):
    @parameterized.expand(
        [
           ['xiaodong','123','success'],
           ['yangfan','456','fail'],
           ['hailong','1273','success'],
           ['liurongxin','1273','success'],
        ]
    )
    def test_login(self,username,passwd,check):
        '正常登陆'
        res = login(username,passwd)
        self.assertEqual(check,res)

unittest.main()

 setUp、tearDown、setUpClass、tearDownClass

 

① setup():每个用例执行前运行
② teardown():每个用例执行后运行

③ setUpClass():必须使用@classmethod 装饰器,所有用例执行前运行一次

④ tearDownClass():必须使用@classmethod装饰器,所有用例执行后运行一次

import unittest

class MyTest(unittest.TestCase):
    def setUp(self):#每条用例执行之前会执行setup
        print('这是setup')
    def tearDown(self):#每条用例执行之后都会执行teardown
        print('这是teardown')
    @classmethod
    def setUpClass(cls):#这个类里面的所有用例执行之前,最先执行它,最前面
        print('这是setupclass')
    @classmethod
    def tearDownClass(cls):#这个类里面所有的用例执行完之后执行它,最后面
        print('tearDownClass')

    def test_reg(self):
        print('============我是用例1================')

    def test_login(self):
        print('============我是用例2================')

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

运行结果:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

这是setupclass
这是setup
============我是用例1================
这是teardown
这是setup
============我是用例2================
这是teardown
tearDownClass

 

posted @ 2019-07-30 17:33  柠檬不萌!  阅读(452)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end