zoukankan      html  css  js  c++  java
  • yaml模块管理用例,单元测试unittest+数据驱动(yml),html报告

    1.yaml 可以用来做数据驱动,比较灵活

    import yaml   #用来读配置文件的比如file文件 文件以yaml和yml结尾   这种格式写用例比较容易处理,字典方便取值 取不到就没有不报错,主要是灵活。

    f = open('login.yaml',encoding='utf-8')
    res = yaml.load(f) #加载读出文件 将键值对转化为字典
    print(res)

    比如:login.yml
    -  #是list的写法  可以防止字典相同的key覆盖
    url : /api/user/login
    method : post
    detail : 正常登录
    data :
    username : niuhanyang
    passwd : aA123456
    check :
    - userId
    - sign

    -
    url : /api/user/login
    method : post
    detail : 密码错误
    data :
    username : niuhanyang
    passwd : aA12333
    check :
    - 密码错误

    -
    url : /api/user/login
    method : post
    detail : 不传密码
    data :
    username : niuhanyang
    check :
    - 必填参数未填
    2.单元测试
    import unittest    #单元测试模块
    import HTMLTestRunner #用来生成报告用
    from BeautifulReport import BeautifulReport as bf #好看的测试报告 bf是别名方便使用
    class TestCalc(unittest.TestCase): #继承 变为测试用例
    def setUp(self):
    print('setup是啥时候运行的')
    #每个用例运行之前运行的 可以作为后续的前提条件
    def tearDown(self):
    print('teardown是啥时候运行')
    #每个用例运行之后运行的 可以在收尾做比如删除数据的操作。
    @classmethod #定义类方法
    def setUpClass(cls): #直接继承父类方法
    #在所有用例执行之前运行的
    print('什么时候运行的setupclss')

    @classmethod
    def tearDownClass(cls):
    #在所有用例都执行完之后运行的
    print('什么时候运行的teardownclass')

    def testliuwei(self): #用例执行顺序是按照首字母的顺序(在报告中可看出)
    '''刘伟测试''' #通过‘’‘来加入用例描述 报告中就会加入用例描述
    print('刘伟')
    self.assertEqual(1,1) #该子类没有 继承父类比较两个值 后面也可以再加参数作为提示信息。
    def testzch(self): #以test开头就可以运行用例 否则不会自动运行
    '''赵传慧测试'''
    print('赵传慧')
    self.assertEqual(1,2)
    def testa(self):
    print('testa')
    self.assertEqual(1,1)
    def testc(self):
    print('testc')
    self.assertEqual(1,2)


    # unittest.main() #会运行当前python文件里面的所有测试用例 **运行时注意run 产生报告时不用该模式

    将用例产生报告主要有以下几个步骤
    # 1、先把所有的测试用例都放到用例集。用例集也做测试套件是用来存放测试用例的
    #2、运行这些测试用例
    #3、产生报告
    suite = unittest.TestSuite() #测试集合 存放用例 其实是一个list
    suite.addTest( unittest.makeSuite(TestCalc) ) #把刚才写的用例加进来 **写入类名

    bf报告生成
    run = bf(suite) #实例化一下,他是一个类必须实例化使用
    run.report(description='描述必须写',filename='test') #还可指定log位置等

    HtmlTESTRunner如何产生报告
    # f = open('test.html','wb') #以2进制模式 不考虑编码集的问题
    # runner = HTMLTestRunner.HTMLTestRunner(f,title='双鱼座用例标题',description='这是用例描述') #后面两个参数是非必须的
    # runner.run(suite) #运行用例

    3.利用yaml做数据驱动来做测试接口

    import unittest,requests

    import ddt  #   #可做参数化  自动读文件中数据

    from BeautifulReport import BeautifulReport as bf

    from urllib import parse

    @ddt.ddt  #申明这个类要别ddt使用啦

    class Login(unittest.TestCase):

             base_url = 'http://118.24.3.40/'   #为给url统一加前缀   可写入配置文件比较好

             @ddt.file_data('login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数,并且传给下面函数的如kwargs中,有多少条数据循环调用多少次下面的函数  注意修改文件open源码加入utf8编码打开不报

             def test_request(self,**kwargs):

                       detail = kwargs.get('detail','没写用例描述')  # '''和%s组合来描述用例在这里无效。

                       self._testMethodDoc = detail  #动态的用例描述

                       url = kwargs.get('url')#url

                       url = parse.urljoin(self.base_url,url)#拼接好url  只能拼接 比如关于/的问题处理

                       method = kwargs.get('method','get')#请求方式给他一个默认值get  防止没有传请求方式

                       data = kwargs.get('data',{}) #请求参数

                       header = kwargs.get('header',{})#请求头

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

                       check = kwargs.get('check')

                       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=data,cookies=cookie,headers=header).text

                       except Exception as e:

                                print('接口请求出错')

                                res = e

                       for c in check:

                                self.assertIn(c,res,msg='预计结果不符,预期结果【%s】,实际结果【%s】'%(c,res))    #查看是否包含 断言查看一次错误就停止,后面加如错误提示  但check在yml中得是list方便查看是否包含。

    sutie = unittest.TestSuite()

    sutie.addTest(unittest.makeSuite(Login))#添加用例

    run = bf(sutie)  #实例化

    run.report('login_test','登录测试用例')

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

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

    思考?

    # 1、运行的用例条数是不是和你的用例数一样

    # 2、看看有没有其他不对的地方

  • 相关阅读:
    kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    MYSQL 大数据
    MYSQL 数据库优化
    原始代理需要改进的地方
    JDK动态代理
    使用CGLIB生成代理
    Spring
    Struts2面试题
    hibernate面试题
    Mac下创建隐藏用户
  • 原文地址:https://www.cnblogs.com/cslw5566/p/9136569.html
Copyright © 2011-2022 走看看