pytest测试代码详细描述(其四)

以用户下的模型模块测试为例

from pytest import fixture, mark, raises

from antilles.user.models import User

'''
为方便理解,添加了与本模块有关的代码块
def login_fail(self):
        self.fail_chances += 1
        if self.fail_chances >= settings.LOGIN_FAIL_MAX_CHANCE:
            self.fail_chances = 0
            self.effective_time = \
                timezone.now() + settings.LOGIN_FAIL_LOCKED_DURATION

        self.save()

def login_success(self):
    self.last_login = timezone.now()
    self.fail_chances = 0
    self.save()

def is_activate(self):
    return timezone.now() >= self.effective_time

'''

'''
fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。
比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,
否则每个测试用例都要做这两步也是冗余。
'''
@fixture
def user(username):
    user = User.objects.create(username=username)
    user._passwd = None

    assert user.workspace is None
    assert user.uid is None

    return user

'''
mark主要是用来指定参数的!
个函数都要把 user 作为参数传递进去
mark.django_db 是django 配合的测试模块 pytest-django
使用pytest标记来告诉pytest-django您的测试需求数据库访问
每一次数据库请求都要绑定 mark.django_db
'''

@mark.django_db
def test_login_fail(user, settings):
    #登陆次数测试,遍历到最大尝试次数
    for index in range(settings.LOGIN_FAIL_MAX_CHANCE):
        #遍历最终的结果是,fail_chances=0
        '''
        self.effective_time = \
                timezone.now() + settings.LOGIN_FAIL_LOCKED_DURATION
        '''
        user.login_fail()

    assert user.fail_chances == 0
        '''
         def is_activate(self):
            return timezone.now() >= self.effective_time
        '''
    assert not user.is_activate()


@mark.django_db
def test_login_succes(user):
    '''登陆测试'''
    # 判断是否是最大次数
    user.login_fail()
    #更改最近登陆时间!
    user.login_success()

    assert user.fail_chances == 0
    assert user.is_activate()


@mark.django_db
def test_role(user):
    assert not user.is_anonymous()
    assert user.is_authenticated()
    assert not user.is_admin

    from rest_framework.exceptions import PermissionDenied
    from antilles.user.permissions import AsAdminRole

    with raises(PermissionDenied):
        user.require_role(AsAdminRole)

    assert not user.check_role('admin')
    assert user.check_role('user')


@mark.django_db
def test_ent(username, mocker):
    from collections import namedtuple

    mock_group = namedtuple(
        'mock_group',
        ['gr_name', 'gr_gid', 'gr_passwd', 'gr_mem']
    )
    mock_user = namedtuple(
        'mock_user',
        [
            'pw_name', 'pw_passwd',
            'pw_uid', 'pw_gid',
            'pw_gecos', 'pw_dir',
            'pw_shell'
        ]
    )

    mocker.patch(
        'antilles.user.models.pwd.getpwnam',
    ).return_value = mock_user(
        pw_name='test', pw_passwd='x',
        pw_uid=123, pw_gid=456,
        pw_gecos='test',
        pw_dir='dir', pw_shell='/bin/bash'
    )

    mocker.patch(
        'antilles.user.models.grp.getgrgid',
    ).return_value = mock_group(
        gr_name='group',
        gr_gid=456,
        gr_mem=[],
        gr_passwd='x'
    )

    user = User.objects.create(username=username)

    assert user.workspace == 'dir'
    assert user.uid == 123
    assert user.gid == 456
    assert user.group.gr_gid == 456

 

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