c5 unittest使用

unittest 官方文档:https://docs.python.org/zh-cn/3/library/unittest.html
#一、初识unittest
1、测试类必须继承unittest.TestCase
2、setUp、tearDown方法每个用例执行完都会执行
3、使用类方法装饰器@classmethod,setUpClass、tearDownClass方法只执行一次

4、实例

#test unittest
import unittest
class TestClass(unittest.TestCase):

    @classmethod
    #类方法,每个类只执行一次
    def setUpClass(cls):
        print 'setUpClass***************************************'


    def setUp(self):
        print 'setUp *******************'

    def test_case1(self):
        print 'case1=============='

    def test_case2(self):
        print 'case2============'

    def tearDown(self):
        print 'tearDown****************'

    @classmethod
    # 类方法,每个类只执行一次
    def tearDownClass(cls):
        print 'tearDownClass****************************************'



if __name__ =='__main__':
	#执行用例
    unittest.main()

运行结果:
在这里插入图片描述
5、用例方法名必须符合unittest的规则test_开头,用例方法的执行顺序是按照test_后的字母顺序执行的,如果需要依赖应该尽量按照字母顺序,先使用的放在前面。
6、用例方法之间尽量独立,如果实在需要使用共同的内容,可用全局变量。
7、断言:使用unittest自带的assert,具体断言类型参考官方文档。
8、全局变量实例

#coding:utf-8

import unittest
from myTest.utils.DealRequest import *
class TestDemo(unittest.TestCase):

    def setUp(self):
        res = None
        print'start++++++++++++++++++++++++++++++'

    def test_case1(self):
        url = 'http://mapi.itougu.jrj.com.cn/wireless/search/'
        data = {
            'type': 'view',
            'keyword': '测试',
            'from': 0,
            'size': 10,
        }
        res = DealRequest(url,'GET',data)
        print res.res
        #定义全局变量
        globals()['common'] ='1234567890'
        retCode = res.res['retCode']
		#断言
        self.assertEqual(retCode,0,'success')

    def test_case2(self):
        url = 'http://mapi.itougu.jrj.com.cn/wireless/search/'
        data = {
            'type': 'view',
            'keyword': '测试',
            'from': 0,
            'size': 10,
        }
        res = DealRequest(url, 'POST', data)
        print type(res.res)
        #调用全局变量
        print common
        retCode = res.res['retCode']
        #断言
        self.assertEqual(retCode, 0, 'success')

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

文件结构:
在这里插入图片描述

#二、组织用例
##1、使用TestSuite()测试套件组织用例
主要使用方法:
addTest()添加单个用例
addTests()添加用例列表
TestSuite源码:

class TestSuite(Testable):
    def __init__(self, tests: Iterable[Testable] = ...) -> None: ...
    def addTest(self, test: Testable) -> None: ...
    def addTests(self, tests: Iterable[Testable]) -> None: ...
    def run(self, result: TestResult) -> None: ...
    def debug(self) -> None: ...
    def countTestCases(self) -> int: ...
    def __iter__(self) -> Iterator[Testable]: ...

调用TestSuite实例使用TextTestRunner类的run方法
结构如下:
在这里插入图片描述
本实例是使用TestSuite执行testDemo2里面的一个用例case

  • testDemo2.py 源码
#coding:utf-8
import unittest
class testDemo2(unittest.TestCase):
    def test_demo2(self):
        print'test_demo2================='

    def test_demo22(self):
        print 'test_demo22=============='

def suite():
    suite = unittest.TestSuite()
    suite.addTest(testDemo2('test_demo22'))
    return suite
  • test_multiDemos.py 源码
#coding:utf-8
import unittest
from myTest.case import testDemo2
if __name__=='__main__':
    runner = unittest.TextTestRunner()
    runner.run(testDemo2.suite())

##2、使用discover组织用例
当用例数特别多时,一个一个添加到用例套件中就会比较麻烦,我们可以使用discover自动检测到用例文件,然后统一添加到用例套件中,这里的用例文件必须以指定的pattern命名才能被发现。
看源码。
结构:
在这里插入图片描述
执行文件:

#coding:utf-8
import unittest
from myTest.case import *


#指定扫描的用例路径
case_path = '../case'

def get_allcase():
	#扫描该路径下的所有用例文件
    discover = unittest.defaultTestLoader.discover(case_path,pattern='test*.py')
    suite = unittest.TestSuite()
    #将用例添加到套件中
    suite.addTest(discover)
    return suite

if __name__=='__main__':
	#执行用例
    runner = unittest.TextTestRunner()
    runner.run(get_allcase())

test_demo1.py

#coding:utf-8
import unittest
class testDemo1(unittest.TestCase):
    def test_demo1(self):
        print"test_demo1======================="

    def test_demo11(self):
        print 'test_demo11====================='

testDemo2.py

#coding:utf-8
import unittest
class testDemo2(unittest.TestCase):
    def test_demo2(self):
        print'test_demo2================='

    def test_demo22(self):
        print 'test_demo22=============='

def suite():
    suite = unittest.TestSuite()
    suite.addTest(testDemo2('test_demo22'))
    return suite

执行结果:
在这里插入图片描述
##3、跳过某个用例 使用skip装饰器
将testDemo2中的test_demo22跳过
在这里插入图片描述
运行结果如下:
在这里插入图片描述
还可以设置跳过条件,更多跳过用例语法参见官方文档。

#三、使用HTMLTestRunner生成报告
1、源码

#coding:utf-8
import unittest
from HTMLTestRunner import HTMLTestRunner
from myTest.case.test_demo1 import TestDemo

from myTest.case import *


#指定扫描的用例路径
case_path = '../case'

#扫描制定的用例
def get_allcase():
    discover = unittest.defaultTestLoader.discover(case_path,pattern='test_*.py')
    suite = unittest.TestSuite()
    suite.addTest(discover)
    return suite

if __name__=='__main__':
	#1、打开文件,如果没有创建文件,可读写方式,重写
    fp = file('my_report.html', 'wb')
    #2、实例化HTMLTestRunner
    runner = HTMLTestRunner(
        stream=fp,
        title='My unit test',
        description='This demonstrates the report output by HTMLTestRunner.'
    )
    #3、组织测试用例
    suite = unittest.TestSuite()
    suite.addTest(get_allcase())
    #4、执行用例并生成测试报告
    runner.run(suite)
	#5、关闭文件
    fp.close()

执行结果:
在这里插入图片描述

2、这里遇到一个问题,用例文件中如果有打印语句时会报错,但是未解决。
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值