python之unittest单元测试

现有一个自行封装的http_requests模块,用于测试http请求,内容如下:

import requests

class HttpRequests:

    def __init__(self,url,para):
        self.url = url
        self.para = para

    def http_requests(self,method):
        try:
            if method.lower() == 'get':
                response = requests.get(self.url,params=self.para)
                return response
            elif method.lower() == 'post':
                response = requests.post(self.url,data=self.para)
                return response
            elif method.lower() == 'delete':
                response = requests.delete(self.url,data=self.para)
                return response
        except Exception as e:
            print('请求错误:',e)

怎样利用python的unittest单元测试对其进行场景覆盖测试呢?

首先明确一下unittest单元测试步骤:

引入unittest模块,unittest模块包括了TestCase--测试用例、TestSuite--测试套、TestLoader--加载器、TextTestRunner--执行测试用例、TextTestResult--测试结果等

--> 创建一个测试类,继承unittest.TestCase类,用于写测试用例

--> 在测试类里定义测试方法,以 test 开头。每一条用例对应一个方法

--> 创建测试套,用于存储测试用例

--> 向测试套里添加测试用例

--> 执行测试用例并生成测试报告

下面一步一步来:

1.引入unittest模块,新建test_reuqests.py文件,一句搞定 import unittest

2.创建测试类,定义测试方法

测试方法就是测试用例,包括预期结果、实际结果,以及预期结果和实际结果的比对结果判断用例是否执行通过

断言:预期结果和实际结果比较,并判断实际结果是否符合预期的过程就是断言

常见的断言方法有:

这里用assertIn的方法,判断预期的字符串是否包含于实际的响应报文中

import unittest

# 引入http_requests模块的httprequests方法 from .http_requests import HttpRequests # 创建测试类 class TestRequests(unittest.TestCase): # 创建测试用例,以test开头 def test_001(self): '''get方法,用户名/密码正确''' res = HttpRequests('http:/xx.xx.xx.xx:xx/xxx/login', {'mobilephone':'186********','pwd':'123456'}).http_requests('get') self.assertIn('登录成功',res.text) def test_002(self): '''get方法,密码为空''' res = HttpRequests('http://xx.xx.xx.xx:xx/xxx/login', {'mobilephone':'186********','pwd':''}).http_requests('post') self.assertIn('密码不能为空',res.text)

如上代码创建了测试类TestRequests,并新建了两条测试用例,分别测试用户名密码正确 和 密码为空的情况,还可以新建更多场景的测试用例,和功能测试用例功能点是一样的。

3.创建测试套,并向测试套中添加测试用例

import unittest
from .test_requests import *

# 创建测试用例容器suite
suite = unittest.TestSuite()

向测试套中添加测试用例有三种方法:

a.直接用addTest加载测试用例

# 增加每一条用例:测试类类名(测试方法名)
suite.addTest(TestRequests('test_001'))
suite.addTest(TestRequests('test_002'))

这种方法需要一条一条用例添加,有几条就需要添加几次。

b.通过TestLoader加载测试用例

loader = unittest.TestLoader()

b方法里面又分两种方法:

b1.通过测试类加载测试用例

# 通过测试类加载测试用例 loadTestsFromTestCase
suite.addTest(loader.loadTestsFromTestCase(TestRequests))

这种方法添加某个测试类,会将该测试类里面的测试方法都添加进来,有几个测试类就需要添加几次。

b2.通过测试类所在模块加载测试用例

# 通过测试类所在模块加载测试用例 loadTestsFromModule
# 需要引入测试类模块
from .xx import test_requests
suite.addTest(loader.loadTestsFromModule(test_requests))

 这种方法最简便,添加测试模块,会把该测试模块里的所有测试类测试方法都添加进来。因此是最常用的。

4.执行测试用例,并生成测试报告

有两种方法:

a.python里unittest单元测试框架提供了生成txt格式的测试报告方法,可以保存到txt文件里

with open('Test_http_requests.txt','w',encoding='utf-8') as file:
    runner = unittest.TextTestRunner(stream=file,verbosity=2)   #verbosity表示报告详细情况,0-2,2最详细
    runner.run(suite)

这种方法比较简单,只是生成txt格式的报告不是很美观,可读性也不是很强

b.这里我们从github上下载一个HTMLTestRunner模块,重新命名为HTMLTestRunnerNew,并存放在python的lib目录下。

import HTMLTestRunnerNew
with open('Test_http_requests.html','wb+') as file:
    runner = HTMLTestRunnerNew.HTMLTestRunner(file,title='http_request测试报告',description='我是描述',tester='南山之喃')
    runner.run(suite)

 把上面步骤3和4整合一下,加载用例采用最常用的通过测试模块加载用例的方法,完整代码如下:

import unittest
from .test_requests import *

# 创建测试用例容器suite
suite = unittest.TestSuite()

# addTest加载测试用例
# 通过测试类所在模块加载测试用例 loadTestsFromModule -- 最常用
# 需要引入测试类模块
from .xx import test_requests
suite.addTest(loader.loadTestsFromModule(test_requests))


# 执行测试用例并生成测试报告
import HTMLTestRunnerNew
with open('Test_http_requests.html','wb+') as file:
    runner = HTMLTestRunnerNew.HTMLTestRunner(file,title='http_request测试报告',description='我是描述',tester='南山之喃')
    runner.run(suite)

 执行如下代码,就会生成名为 http_request测试报告 的html格式测试报告啦,可以在浏览器里预览噢~

是不是还是挺好看滴~

posted @ 2019-03-23 22:55  Dahlia  阅读(451)  评论(0编辑  收藏  举报