单元测试unittest

一、定义

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

unittest通过建立类并继承父类unittest.TestCase将用例组织起来,统一执行

示例:

import unittest

class Testcase(unittest.TestCase):#类继承unittest.TestCase

    def setUp(self):#每条用例运行前,运行。一般可用来做些准备工作

        print('我是setup,什么时候运行')

    def tearDown(self):#每条用例结束后,运行,一般可用来做些收尾工作

        print('teardown什么时候运行')

    def testa(self):

        print('测试用例a')

        self.assertEqual(1,2,'计算结果不正确')

        #assertEqual是父类unittest.TestCase的函数,用来验证实际结果是否与预期结果相等

      #第一个参数是预期结果,第二个参数是实际结果,第三个参数是当前面两个不相等时,回显示的提示信息。第三个参数是非必填的

    def testb(self):

        '''这里是测试用例的描述,会最终显示在测试报告中的,必须用三个单引号括起来才可以,用#d不行'''

        print('测试用例b')

        self.assertEqual(1,1)

    def c(self):

        print('c函数不是以test开头的,所以不会当做用例被执行')

        # self.assertIn('a','abc')

    @classmethod

    def setUpClass(cls):#所有的用例运行前,运行setupClass

        print('什么时候运行setupClass')

    def tearDownClass(cls):#所有用例运行后,执行tearDownClass

        print('什么时候运行tearDownClass')

unittest.main()#执行当前python文件中的所有用例,会在控制台显示运行结果,不会产生测试报告

#运行的时候不要右键运行run unittest for...,这个是pycharm自己给运行的unittest,不会产生测试报告

# 应点击菜单栏中Run--run,弹出提示框后,选择自己要运行的文件进行run

#函数名用例必须以test开头,才会被执行

二、用例集suite+HTMLTestRunner/BeautifulReport

用例集即测试套件,可以吧所有的用例放入用例集当中执行,并结合HTMLTestRunner或者BeautifulReport产生出直观的漂亮的测试报告

#-------------------------------------------------------------------HTMLTestRunner写报告(丑)

#将下载好的HTMLTestRunner.py 放到 pycharm的External Libraries目录下的lib目录下,然后导入:import HTMLTestRunner,紧接着上面的代码:(把unittest.main注释掉)

suite=unittest.TestSuite()#定义用例集,是个list

suite.addTest(unittest.makeSuite(Testcase))#将类TestCase先变成一个用例集合,然后再加入到suite中

f=open('测试报告.html','wb')#建立一个测试报告文件

runner=HTMLTestRunner.HTMLTestRunner(f,title='测试报告标题',description='测试报告描述')#title和decription都是非必填。将用例结果写入测试报告.html

runner.run(suite)#运行用例集,用例执行的顺序是按照字母排序的

然后通过run-run选中要执行的当前文件,运行后,就会产生一个html格式的报告,可用浏览器打开​​​

如下

#--------------------------------------------------------BeautifulReport 报告

#下载BeautifulReport ,解压后运行setup.py。可以将解压后的文件拷贝到pycharm中,然后运行setup.py也可。然后要导入:

from BeautifulReport import BeautifulReport as bf #bf就是个别名,方便使用

suite=unittest.TestSuite()#定义用例集,是个list

suite.addTest(unittest.makeSuite(Testcase))#将类TestCase先变成一个用例集合,然后再加入到suite中

report=bf(suite)##先实例化这个类

report.report(description='用例描述',filename='用例文件名字')

#description必填参数,log_path是非必写的,默认在当前目录下。也可以定义别的目录

#filename可写可不写,回自动生成个名字。名字后缀默认就是html。可写上也可不写

执行后,生成html格式报告:

​打开:

三、用unittest测接口示例

1、接口数据:yaml格式文件,存有3条用例数据

2、用ddt自动读取用例数据并传递给测试类中的测试用例函数

3、执行用例

4、写报告

用例数据

- #用减号-区分不同的用例。最终是个list,然后每个list是个字典:  [{}{}]

  url: /api/user/login

  detail: 正常登录

  method: post

  data:

    username: aaa

    passwd: aA123456

  check:

    - userId

    - error_code

-

  url: /api/user/login

  detail: 密码错误

  method: post

  data:

    username: aaa

    passwd: aA1234

  check:

    - 密码错误

-

  url: /api/user/login

  detail: 必填参数未填,用户名不传

  method: post

  data:

    passwd: aA1234

  check:

    - 必填参数未填

接口测试代码:获取数据,执行测试用例并发送测试结果报告

import unittest

import  ddt#自动读取文件内容,该模块需要先安装pip install ddt

import requests

from BeautifulReport import BeautifulReport as bf

from urllib import parse

@ddt.ddt #声明这个类要用ddt

class Login(unittest.TestCase):

    base_url='http://100.20.20.40'

    @ddt.file_data('login1.yaml')#ddt自动读取文件,并获取内容传给下面的函数,循环调用.运行如果出现字符编码问题,就直接打开file_data源文件,搜索open,将打开文件的代码中,加上encoding=utf-8

    def test_request(self,**kwargs):#**kwargs可以传入字典参数,不限个数.此处用来接收从login1.yaml中读出来的用例,是字典

        detail=kwargs.get('detail','没写用例描述')#如果没有定义detail,默认给个值’没写用例描述‘

        self._testMethodDoc=detail#设置用例描述

        url=kwargs.get('url')

        url=parse.urljoin(self.base_url,url)#自动拼接url,

        method=kwargs.get('method','get')#method默认给个get方法

        data=kwargs.get('data',{})#如果没给data,默认给个空字典

        header=kwargs.get('header',{})#如果没有header参数,默认给个空字典

        cookie=kwargs.get('cookie',{})

        check=kwargs.get('check')#获取login1.yaml中的预期结果check,是list

        method=method.lower()#

        try:

            if method=='get':

                res=requests.get(url,params=data,cookies=cookie,headers=header).text

                #因为实际结果失败的话,不会返回json串,所以不能转成字典

            else:

                res=requests.post(url,data,cookies=cookie,headers=header).text

        except Exception as e:

            print('接口请求出错')

            res=e

        for c in check:#循环遍历check中的所有预期结果,判断是否包含在实际结果中

            self.assertIn(c,res,msg='预期结果不符,预期结果%s,实际结果%s'%(c,res))#断言,如果预期结果在实际结果中,pass.否则断言失败并给出错误信息msg

suite=unittest.TestSuite()

suite.addTest(unittest.makeSuite(Login))

run=bf(suite)

run.report('login_test','登录测试用例')#第一个是描述,第二个是文件名

print(run.success_count)#通过的次数

print(run.failure_count)#失败次数)

笔者创建了一个测试交流群,如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加测试交流群:829792258,还会有同行一起技术交流

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容