pytest 常见组件以及使用(其四)

mocker 组件自定义对象以及方法,网络请求 time.sleep 不需要进行测试 测试的只是程序的运行!
from pytest import mark

@mark.django_db
def test_node_summaries(mocker, node_data):
    # 自定义函数返回值!
    # antilles.cluster.tasks.node_summary.cache.get 的返回值为 node_data
    mocker.patch(
        'antilles.cluster.tasks.node_summary.cache.get',
        return_value=node_data
    )
    # 第二种自定义 方式!
    mock = mocker.patch('antilles.cluster.tasks.summary.cache')
    mock.get.return_value = [ResultSet(query_response["results"][0])]

def test_form_condition(mocker, monkeypatch):
    # 自定义对象!
    stub = mocker.Mock()
    host_stub = mocker.Mock()
    # 对象自定义个属性 hostname
    host_stub.hostname = 'head'
    # 自定义方法的返回值
    stub.count.return_value = 2
    # 自定义方法的返回值
    stub.iterator.return_value = [host_stub, host_stub]
    # 根据自定义的对象 代替 实际之中的对象!
    assert summary._form_condition(stub) == ['head', 'head']
    
    class MockAuthentication(BaseAuthentication):
    def authenticate(self, request):
        return User(username=username, role=ROLE_ADMIN, id=1), None
    # 指定 authentication_classes 的认证类为 MockAuthentication
    monkeypatch.setattr('rest_framework.views.APIView.authentication_classes',
                        [MockAuthentication])
client 模拟接口调用:
conftest.py 之中定义
# 在 conftest.py 之中定义的 fixture 对象首先加载!
@fixture(autouse=True)
def settings(settings, tmpdir):
    # 在 conftest.py 之中定义 settings 是为了能够让整个模块都能加载
    settings.ROOT_URLCONF = 'antilles.cluster.urls'
    settings.CONFLUENT_USER = 'lico'
    settings.CONFLUENT_PASS = 'Paa'
    settings.CONFLUENT_PORT = 4005

    return settings
接口测试实例:
@mark.django_db
def test_nodes_list_view(client, mocker):

    args = {
        "offset": 0,
        "length": 10,
        "filters": [],
        "sort": {
            "prop": "hostname",
            "order": "ascending"}
    }
    # 调用接口 /nodes/?args={0} 
    # 在请求之中 增加header 信息
    token_head = 'token {0}'.format("1111111111111")
    response = client.get('/nodes/?args={0}'.format(json.dumps(args)),HTTP_AUTHORIZATION=token_head)
组件也可以在 非 test_ 来头的函数之中传递:
1,开发时要将代码进行测试规划, 不能到最后才加单元测试代码!这样也不好加!
def mock_cache(mocker, category, query_result):
if category == 'network':
    mocker.patch(
        "django.core.cache.cache.get",
        return_value=[query_result, query_result]
    )
else:
    mocker.patch("django.core.cache.cache.get", return_value=query_result)

@mark.django_db
def test_node_history(client, mocker, nodes, node_category, query_result):
    # 为 特殊的 接口进行 区别对待!
    mock_cache(mocker, node_category, query_result)
    pass
使用 yield处理后续 工作!
@fixture(autouse=True)
def nodes_create():
    node_1 = {
        "hostname": 'lico_head', "type": 'compute', "machinetype": 'ibm',
        "mgt_ipv4": '172.20.0.1', "bmc_ipv4": '10.240.212.13',
        "rack_id": 1, "service": 'compute', "id": 0
    }
    node1 = Node.objects.create(**node_1)
    run_jobs = {
        "job_id": 1, "node": node1, "core_num": 0, "gpu_num": 0
    }
    run1 = RunningJob.objects.create(**run_jobs)
    yield node1, run1
    run1.delete()
    node1.delete()

 

posted @ 2018-11-02 15:21  十七楼的羊  阅读(934)  评论(0编辑  收藏  举报