• 11
  • 11
分享

  通过执行发现,我们在用例03中没有加入fixture,所有他没有执行一些用例的前置和后置操作。

1-7.png

  测试报告

  unittest:unittest中没有自带的测试报告,需要下载第三方的插件HTMLTestRunner和BeautifulReport来生成详细的测试报告。

  pytest:pytest中也没有自带的测试报告,需要下载第三方插件pytest-html或者allure-pytest进行生成详细的测试报告。

class Test01:
    def test_01(self):
        print('登录用例01')
    def test_02(self):
        print('编写用例02')
    def test_03(self):
        print('删除用例03')

  通过在命令中输入命令:pytest --html=report.html进行生成报告。

1-8.png

  参数化功能

  unittest:unittest本身不支持参数化功能,需要通过第三方库DDt来进行完成参数化功能。

  pytest:pytest的参数化有两种方式,一种通过@pytest.mark.pyparametrize的方法,也可以通过@pytest.fixture()中的方法params来完成参数化内容。

  失败重跑

  unittest:目前unittest暂时不支持用例失败重跑机制

  pytest:可以依赖第三方插件pytest-rerunfailures来进行用例失败重跑

import pytest
import random
class Test01:
    @pytest.mark.flaky(reruns=3, reruns_delay=2)
    def test_01(self):
        a = random.randint(0, 3)
        print('通过随机数来确保用例会有几率失败')
        print('随机数是:{}'.format(a))
        assert a == 2
if __name__ == '__main__':
    pytest.main(['-vs'])

  执行代码,发现断言失败后会进行重新执行。

1-9.png

  跳过用例

  当明知测试用例存在bug或者说该用例进行修改过了,本次执行用例时候,不想执行用例,我们可以进行跳过用例。unittest和pytest都有自带的跳过用例方法。安静通过代码实例进行介绍

  unittest中可以通过装饰器skip的方法进行强制跳过,通过skipif的方法加上条件进行跳过,当条件达到是,进行跳过,条件未达到,不进行跳过用例

  pytest中的跳过和unittest基本相似,跳过用例,一样要输入一些条件。

  实战演示

  上面简单的列举了使用的各个方法,其中有一些区别没有举例给大家说明,安静这里简单的通过请求天气和查询身份证接口的形式,编写一些测试用例,将上述没有介绍的内容,给大家通过实例的方式进行连接起来。

  unittest

  这里安静使用到unittest的参数化是通过ddt的形式,测试数据没有单独存放,直接放到了类外面,安静这里创建了两个接口(查询天气和查询身份证)使用了跳过用例的方法,并对测试接口进行了断言操作,并通过HTMLTestRunner的方法生成了测试报告:

import unittest
import requests
import HTMLTestRunner_cn
import ddt
# 天气接口的参数化数据
data = [{"city": '上海', "key": "331eab8f3481f37868378fcdc76cb7cd", 'result':"查询成功!"},
        {"city": "上海", "key": "331eab8f3481f37868378fcdc76cb7c", 'result':"错误的请求KEY"},
        {"city": "上", "key": "331eab8f3481f37868378fcdc76cb7cd", 'result':"暂不支持该城市"}]
@ddt.ddt
class Test_(unittest.TestCase):
    def tianqi(self,city,key):
        '''天气接口'''
        data = {
            "key":key,
            "city":city
        }
        r = requests.post(url='http://apis.juhe.cn/simpleWeather/query',data=data)
        return r.json()
        
    def shenfenzheng(self,cardno,key):
        '''身份证查询接口'''
        data = {
            "cardno":cardno,
            "key":key
        }
        r = requests.post('http://apis.juhe.cn/idcard/index',data= data)
        return r.json()
        
    @ddt.data(*data)
    def test_01(self,data):
        '''参数化的天气接口'''
        x = self.tianqi(city=data['city'], key=data['key'])
        self.assertEqual(x['reason'], data['result'])
        
    def test_02(self):
        '''正确的身份证号正确的key'''
        cardno = '130428197411155947'   # 身份证信息通过Faker随机创建
        key = "f40a75704fac353952a6534a18f9f437"
        # 请求查询身份证接口
        a = self.shenfenzheng(cardno,key)
        self.assertIn(a['reason'], '成功的返回')
        
    @unittest.skip('强制跳过,不需要条件')
    def test_03(self):
        '''正确的身份证号错误的key(跳过用例)'''
        cardno = '130428197411155947'
        key = "f40a75704fac353952a6534a18f9f43"
        a = self.shenfenzheng(cardno, key)
        self.assertEqual(a['reason'], '错误的请求KEY')
        
    @unittest.skipIf(True, '条件成立时候,进行跳过')
    def test_04(self):
        '''错误的身份证号正确的key(跳过用例)'''
        cardno = '42082120031108929'
        key = "f40a75704fac353952a6534a18f9f437"
        a = self.shenfenzheng(cardno, key)
        self.assertEqual(a['reason'], '请输入正确的15或18位身份证')
if __name__ == '__main__':
    report_path = 'report.html'
    # 打开报告
    fp = open(report_path, 'wb')
    # 报告详情
    runner = HTMLTestRunner_cn.HTMLTestRunner(stream=fp,
                                              title=u'自动化测试报告,测试结果如下:',
                                              description=u'用例执行情况:')
    # 实例化
    testunit = unittest.TestSuite()
    # 加载用例
    testunit.addTests(unittest.TestLoader().loadTestsFromTestCase(Test_))
    # 执行用例
    runner.run(testunit)
    # 关闭报告
    fp.close()

  通过执行代码后发现已经可以成功的生成测试报告。

1-10.png

  pytest

  pytest这里安静也是通过上述的内容进行了修改,只是这里使用的框架是pytest。但是实现内容是一样的。天气接口进行参数化,身份证接口中2个跳过。在生成测试报告,这里安静生成的测试报告是通过allure来生成的:

import requests
import json
import pytest
# 参数不同值
# 天气接口的参数化数据
data = [({"city": '上海', "key": "331eab8f3481f37868378fcdc76cb7cd", 'result':"查询成功!"}),
        ({"city": "上海", "key": "331eab8f3481f37868378fcdc76cb7c", 'result':"错误的请求KEY"}),
        ({"city": "上", "key": "331eab8f3481f37868378fcdc76cb7cd", 'result':"暂不支持该城市"})]
class TestCase:
    def weather(self, city, key):
        url = 'http://apis.juhe.cn/simpleWeather/query'
        # 查询天气接口参数
        data = {
            'city': city,
            'key': key
        }
        r = requests.post(url, data=data)
        return r.json()
    def shenfenzheng(self,cardno,key):
        '''身份证查询接口'''
        data = {
            "cardno":cardno,
            "key":key
        }
        r = requests.post('http://apis.juhe.cn/idcard/index',data= data)
        return r.json()
    @pytest.mark.parametrize('data',data)
    def test_01(self,data):
        # 调用天气预报接口
        r = TestCase().weather(city= data['city'],key = data['key'])
        assert r['reason'] == data['result']
    def test_02(self):
        '''正确的身份证号正确的key'''
        cardno = '130428197411155947'   # 身份证信息通过Faker随机创建
        key = "f40a75704fac353952a6534a18f9f437"
        # 请求查询身份证接口
        a = self.shenfenzheng(cardno,key)
        assert a['reason'] == '成功的返回'
    @pytest.mark.skip('强制跳过,不需要条件')
    def test_03(self):
        '''正确的身份证号错误的key(跳过用例)'''
        cardno = '130428197411155947'
        key = "f40a75704fac353952a6534a18f9f43"
        a = self.shenfenzheng(cardno, key)
        assert  a['reason'] =='错误的请求KEY'
    @pytest.mark.skipif(True, reason='条件成立时候,进行跳过')
    def test_04(self):
        '''错误的身份证号正确的key(跳过用例)'''
        cardno = '42082120031108929'
        key = "f40a75704fac353952a6534a18f9f437"
        a = self.shenfenzheng(cardno, key)
        assert a['reason'] in '请输入正确的15或18位身份证'
if __name__ == '__main__':
    pytest.main(['-s'])

  这里我们通过在cmd中先执行pytest --alluredir report进行打开报告,然后在通过allure serve report打开测试报告。从报告中就能看到已经全部都执行成功了,且用例跳过了2条。

1-11.png

  总结

  安静简单的列举出来了几点并通过项目实例进行对比两种框架的情况。其中我们可以看出来unittest编写用例比pytest复杂,最最最主要的一点是unittest没有较多的第三方插件支持,但是pytest可以支持更多的第三方插件,这样可以更加方便的进行投入到编写测试用例的过程中。当然对于新手来说,安静还是推荐先使用unittest,看看unittest的源码内容,当unittest学会之后在去接触pytest,这样就更加容易上手。其次unittest作为Python中的内置框架,也是值得大家进行学习的。



作者:测试安静   

来源:http://www.51testing.com/html/97/n-4480397.html


2021 问卷礼物图.png

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 在进行性能测试方案设计前,需要对系统的并发数进行估算,在这里总结了几种计算方法可以提供参考平均并发数计算平均并发数 = (最大活跃用户数 * 访问页面所需时间) / 页面被持续访问时间最大活跃用户数: 不管采用什么公式计算,都只能使用最大活跃用户数进行计算,不能按用户总量计算;访问页面所需时间:单个用户在访问页面所需的单位时间,比如用户打开首页这个动作,从开始到加载完成所需要的时间;访问页面持续时间:活跃用户在高峰时间段访问页面的持续时间,如:早上9点半~10点是高峰访问时间段,则持续时间是30分钟;举个例子:某站有1W活跃用户,在9...
            0 0 2717
            分享
          • 学习过测试理论的同学肯定都知道,测试人员参与项目的第一步,大部分都是需求评审,但是不少测试同学反馈,自己很少参与需求评审,需求会议也很少喊测试人员参与。我觉得这一方面可能是流程上各角色配合的问题,另一方面可能是因为测试在评审过程中没有体现出参与的价值。针对第一个可能,需要测试主动找产品沟通,一方面表达希望参与需求评审的意愿,另一方面也要求他们在需求评审时喊上测试。针对第二个可能,就需要测试人员从自身上做改进了,为什么这么说呢?我曾经参加过几次需求评审会议,就发现产品在那讲需求,开发偶尔会提一些技术实现上的细节问题,测试就只是在那听了,会议结束后,回去该干嘛干嘛,既然我们测试参与需求评审时不能产...
            3 4 4590
            分享
          • 前言小程序直播功能,分为使用官方自带的直播组件( live-player-plugin ,无需二次开发,开箱即用),另一种就是使用自己服务器的流,自定义直播组件(live-player、live-pusher),这里主要讲述,第一种的使用一、准备第一要了解是否满足 直播开通条件基本满足开头直播条件的功能里会有直播,然后去申请开通一下就行了创建直播间这个直播码就是主播开启直播的入口,主播扫码就可以进入基本信息点击后选择手机直播推流直播创建时需要核实身份 同时开播时间必须在12小时内 第一次开通需要人脸识别验证样式配置二、开发使用引入插件原生引入在app.jison1. 主包引入 &nb...
            13 14 2696
            分享
          •   面对ChatGPT的来势汹汹,谷歌彻底慌了。  OpenAI发布ChatGPT也不过是4个月之前。但是在这4个月里,已经有不少预言,称ChatGPT带来的变革,将会颠覆谷歌的现有搜索产品和商业模式。  于是,谷歌CEO桑达尔·皮柴(Sundar Pichai) 开启“战备”状态:先是在ChatGPT问世两周内就拉起了“红色警报”,然后创始人拉里·佩奇和谢尔盖·布林时隔3年再度被紧急唤回。  今天皮柴更是在官网上称,谷歌一直在研发一款名为Bard的实验性对话AI服务,今天起,谷歌将把它对信任的开发者开放,然后将在接下来的几周内,把它向更广泛的受众开放。  谷歌终于加入了这场智能聊天机器人对搜...
            0 0 976
            分享
      • 51testing软件测试圈微信