• 6.实现合同测试用例


    实现合同测试用例-合同分类-签约对象

    用例数据依赖分析

    图 1

    • 注意:
      • 虽然签约对象和合同类型在同一级目录,但是如果我们用例组织和放在同一级目录下,那么用例就会出现分叉,用例就不在一条线上,合同分类就复用不了签约对象的conftest,为了复用conftest,建议把合同分类放到签约对象下面

    在原有的目录结构的基础上,新增目录签约对象,新建conftest文件

    import pytest
    
    @pytest.fixture(scope='session')
    def init_accounts():
        pass
    

    接着实现测试库
    business下面实现

    #合同API
    class ContractsAPI(BaseAPI):
        pass
    
    #签约对象API
    class AccountsAPI(BaseAPI):
        pass
    
    #合同分类API
    class ContractTypesAPI(BaseAPI):
        pass
    

    接着要实现配置文件,从接口文档拷贝

    ContractsAPI:
      path: /api/v4/contracts
      add:
        {
           "no": "009",
           "create_date": "2020-07-07T07:31:06.754Z",
           "company_id": "QmBLZC5zKaEMu96QN",
           "othercompany": "38n6uHtDsdfmQ72jT",
           "project": "jgrJCeMttzD8pHZhy",
           "contract_type": "7Gy5aL2sM3gqnsg77",
           "name": "test001",
           "bop": "付款合同",
           "applicant": "5efae24570ff1b0012038be1",
           "owner": "5efae24570ff1b0012038be1",
           "virtual_contract": "合同",
           "amount": 0,
           "amount_type": "固定",
           "receive_payment_type": "一次性",
           "paid_amount": 0,
           "unpaid_amount": 0,
           "receipted_amount": 0,
           "unclaimed_votes_amount": 0,
           "received_amount": 0,
           "unreceived_amount": 0,
           "for_invoicing_amount": 0,
           "unfor_invoicing_amount": 0,
           "space": "jTaQzFyri4ojvYSQm"
        }
      edit:
        {
             "no": "009",
             "create_date": "2020-07-07T07:31:06.754Z",
             "company_id": "QmBLZC5zKaEMu96QN",
             "othercompany": "38n6uHtDsdfmQ72jT",
             "project": "jgrJCeMttzD8pHZhy",
             "contract_type": "7Gy5aL2sM3gqnsg77",
             "name": "test001",
             "bop": "付款合同",
             "applicant": "5efae24570ff1b0012038be1",
             "owner": "5efae24570ff1b0012038be1",
             "virtual_contract": "合同",
             "amount": 0,
             "amount_type": "固定",
             "receive_payment_type": "一次性",
             "paid_amount": 0,
             "unpaid_amount": 0,
             "receipted_amount": 0,
             "unclaimed_votes_amount": 0,
             "received_amount": 0,
             "unreceived_amount": 0,
             "for_invoicing_amount": 0,
             "unfor_invoicing_amount": 0,
             "space": "jTaQzFyri4ojvYSQm"
        }
    
    AccountsAPI:
      path: /api/v4/accounts
      add:
        {
             "name": name,
             "category": 1,
             "company_ids": ["QmBLZC5zKaEMu96QN"],
             "status": 1,
             "space": self.api.space
        }
      edit:
        {
         "name": "testobj001",
         "phone": "400-888888",
         "address": "南京市软件大道",
         "registered_capital": 1000000,
         "category": "1",
         "credit_code": "370202199507078631",
         "company_ids": [
         "QmBLZC5zKaEMu96QN"
         ],
         "status": "2",
         "space": "jTaQzFyri4ojvYSQm"
        }
    
    ContractTypesAPI:
      path: /api/v4/contract_types
      add:
        {
         name: "房租合同",
         code: "2020-001",
         space: "jTaQzFyri4ojvYSQm"
        }
      edit:
        {
         'name': "房租合同1",
         'code': "2020-001",
         'space': "jTaQzFyri4ojvYSQm"
        }
    

    优化测试库

    import pytest
    from pylib.webapi.bussiness import AccountsAPI
    
    #签约对象--vip
    @pytest.fixture(scope='session')
    def init_accounts(init_admin,empty_organization):
        account_api=AccountsAPI(init_admin)
        org =empty_organization #待关联的部门
        account=account_api.add(name='VIP客户',company_ids=[org['_id']])
        yield account
        account_api.delete(account['_id'])
    

    实现合同类型测试库

    在签约对象下面创建合同类型目录,在目录下面创建conftest实现测试库

    import pytest
    from pylib.webapi.bussiness import ContractTypesAPI
    
    @pytest.fixture(scope='session')
    def init_contracttypes(init_admin):
        ctapi=ContractTypesAPI(init_admin)
        account_type=ctapi.add(name='收购合同',code='888888')
        yield account_type
        ctapi.delete(account_type['_id'])
    

    实现合同用例

    import pytest
    from pylib.webapi.bussiness import ContractsAPI
    
    def test_tc003001(init_admin,init_accounts,init_contracttypes,init_organiz):
        contract_api=ContractsAPI(init_admin)
        #step1
        contract=contract_api.add(name='001号合同',othercompany=init_accounts['_id'],contract_type=init_contracttypes['_id'],company_id=init_organiz['_id'])
        #step2
        contracts=contract_api.list_all()
        #step3
        assert contract in contracts
    

    发现,新增接口的入参都是关键字参数形式,可以定义一个字典,然后拆包成关键字参数

        contract_api=ContractsAPI(init_admin)
        kws={
            'name' : '001号合同', 
            'othercompany' : init_accounts['_id'],
            'contract_type' : init_contracttypes['_id'],
            "company_id" :init_organiz['_id']
        }
        #step1
        contract=contract_api.add(**kws)
    

    接着做数据清除操作:

    import pytest
    from pylib.webapi.bussiness import ContractsAPI
    
    def test_tc003001(after_tc003001,init_accounts,init_contracttypes,init_organiz):
        global contract
        contract_api=after_tc003001
        kws={
            'name' : '001号合同',
            'othercompany' : init_accounts['_id'],
            'contract_type' : init_contracttypes['_id'],
            "company_id" :init_organiz['_id']
        }
        #step1
        contract=contract_api.add(**kws)
        #step2
        contracts=contract_api.list_all()
        #step3
        assert contract in contracts
    
    @pytest.fixture()    
    def after_tc003001(init_admin):
        contract_api = ContractsAPI(init_admin)
        yield contract_api
        contract_api.delete(contract['_id'])
    

    执行通过,但是通过抓包发现,创建日期使用模板时间,跟实际时间不一致
    图 2

    生成一个时间格式跟入参一致

    控制台调试
    import time
    time.localtime()
    time.struct_time(tm_year=2021, tm_mon=8, tm_mday=15, tm_hour=15, tm_min=39, tm_sec=32, tm_wday=6, tm_yday=227, tm_isdst=0)
    from datetime import datetime
    datetime.now()
    datetime.datetime(2021, 8, 15, 15, 39, 52, 554317)
    
    localtime时间精确度没有now高
    dt=datetime.now()
    dt.strftime('%Y-%m-%dT%H:%M:%S.%f')
    '2021-08-15T15:43:07.888396'
    dt.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3]+'Z'
    '2021-08-15T15:43:07.888Z'
    

    在utils增加一个pulgings.py文件,定义一个类处理数据转换

    from datetime import datetime
    class Conver_data:
        @staticmethod
        def current_time(time_formate='%Y-%m-%dT%H:%M:%S.%f'):
            dt=datetime.now()
            return dt.strftime(time_formate)[:-3]+'Z'
    

    优化测试用例,增加入参

        kws={
            'name' : '001号合同',
            'othercompany' : init_accounts['_id'],
            'contract_type' : init_contracttypes['_id'],
            "company_id" :init_organiz['_id'],
            "create_date":Conver_data.current_time()
        }
    

    问题记录

    • 1、从PDF接口文档拷贝配置文件到pycharm,出现NBSP
      • 解决:复制[NBSP]这个奇怪的东西,(剪贴板显示的其实还是空格),按住CTRL+R,上面的是一个空格(事先复制的NBSP),下面不要填,替换所有的。相当于把NBSP删除。over。

    https://blog.csdn.net/weixin_40912987/article/details/117661447

    • 2、init_admin = <RequestsCookieJar[Cookie(version=0, name='X-Access-Token', value='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7In...cified=True, secure=False, expires=1636787352, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>
      empty_organization = <pylib.webapi.bussiness.OrganizAPI object at 0x000001F406EA45B0>

      @pytest.fixture(scope='session')
      def init_accounts(init_admin,empty_organization):
      account_api=AccountsAPI(init_admin)
      org =empty_organization #待关联的部门

      account=account_api.add(name='VIP客户',company_ids=[org['_id']])
    

    E TypeError: 'OrganizAPI' object is not subscriptable

    tcD-管理员登录D-需求部D-签约对象conftest.py:14: TypeError

    解决:
    empty_organization返回的是api
    def init_accounts(init_admin,init_organiz):
    account_api=AccountsAPI(init_admin)

  • 相关阅读:
    Python 压缩图片至指定大小
    nginx 服务器自签https协议 (Let’s Encrypt)
    Django 批量创建app
    常见的设计模式(python )———适配器模式
    带你完全理解Python中的metaclass,type,class之间的恩怨情仇...
    常见的设计模式(python)———单例模式(转载)
    常见的设计模式(python)———工厂模式
    常见的设计模型(python)——建造者模型
    Django-restframework 概述及目录
    Java多线程开发
  • 原文地址:https://www.cnblogs.com/xiehuangzhijia/p/15144679.html
Copyright © 2020-2023  润新知