简体   繁体   English

更多pythonic测试方法

[英]more pythonic way to test

Ok I'm writing tests for my Django app. 好的,我正在为我的Django应用程序编写测试。 I'm trying to figure out a way to iterate over the testing for a ajax register call for the appropriate responses. 我试图找出一种方法来迭代测试以获取适当响应的ajax注册调用。 It's working but I know it can be done in a more efficient way. 它正在工作,但我知道可以以更有效的方式完成它。

def test_ajax_register(self):
    c = Client()
    # Check register success
    response = c.post('/register/', {
        'register-username': 'testuser',
        'register-email': 'testuser@email.com',
        'register-password': 'password'
    })
    self.assertEqual(json.loads(response.content)['status'], 'success')
    self.assertEqual(response.status_code, 200)

    # Check register failed  username taken
    response = c.post('/register/', {
        'register-username': 'testuser',
        'register-email': 'testuser@email.com',
        'register-password': 'password'
    })
    self.assertEqual(json.loads(response.content)['status'], 'fail')
    self.assertEqual(json.loads(response.content)['error_msg'], 'username already in use')

    # Check register failed email in use
    response = c.post('/register/', {
        'register-username': 'testuser1',
        'register-email': 'testuser@email.com',
        'register-password': 'password'
    })
    self.assertEqual(json.loads(response.content)['status'], 'fail')
    self.assertEqual(json.loads(response.content)['error_msg'], 'email already in use')

    # Check register failed  password length
    response = c.post('/register/', {
        'register-username': 'testuser2',
        'register-email': 'testuser2@email.com',
        'register-password': 'pass'
    })
    self.assertEqual(json.loads(response.content)['status'], 'fail')
    self.assertEqual(json.loads(response.content)['error_msg'], 'password must be atleast 8 characters long')

Just separate your tests into separate methods. 只需将测试分成单独的方法即可。 Each of them will be triggered as long as they have prefix test_ , and each test can also run as a stand alone test. 只要它们具有前缀test_ ,它们就会被触发,并且每个测试也可以作为独立测试运行。 Use setUp and tearDown methods, if need to preset anything. 如果需要预设任何内容,请使用setUp和tearDown方法。

def test_ajax_register(self):
    # Test registration 
    c = Client()
    # Check register success
    response = c.post('/register/', {
        'register-username': 'testuser',
        'register-email': 'testuser@email.com',
        'register-password': 'password'
    })
    self.assertEqual(json.loads(response.content)['status'], 'success')
    self.assertEqual(response.status_code, 200)


def test_failed_registration(self):
    # Check register failed  username taken
    response = c.post('/register/', {
        'register-username': 'testuser',
        'register-email': 'testuser@email.com',
        'register-password': 'password'
    })
    self.assertEqual(json.loads(response.content)['status'], 'fail')
    self.assertEqual(json.loads(response.content)['error_msg'], 'username already in use')


def test_email_in_use(self):
    # Check register failed email in use
    response = c.post('/register/', {
        'register-username': 'testuser1',
        'register-email': 'testuser@email.com',
        'register-password': 'password'
    })
    self.assertEqual(json.loads(response.content)['status'], 'fail')
    self.assertEqual(json.loads(response.content)['error_msg'], 'email already in use')


def test_password_length(self):
    # Check register failed  password length
    response = c.post('/register/', {
        'register-username': 'testuser2',
        'register-email': 'testuser2@email.com',
        'register-password': 'pass'
    })
    self.assertEqual(json.loads(response.content)['status'], 'fail')
    self.assertEqual(json.loads(response.content)['error_msg'], 'password must be atleast 8 characters long')

In general, you should split the big test logically and follow the UnitOfWork_StateUnderTest_ExpectedBehavior test method naming practice . 通常,您应该按逻辑拆分大测试,并遵循UnitOfWork_StateUnderTest_ExpectedBehavior测试方法的命名惯例

The concept of data-driven tests is also a relevant idea, I've personally used ddt package in the past and then switched to pytest parameterized tests - that is a great way to test the same specific "symptom" of a function under test using different input data - this would help to prevent code duplication ( DRY principle ) and make your tests more organized and readable. 数据驱动测试的概念也是一个相关的想法,我过去亲自使用过ddt ,然后切换到pytest参数化测试 -这是一种使用以下方法测试被测函数的相同特定“症状”的好方法不同的输入数据-这将有助于防止代码重复( DRY原理 ),并使您的测试更具组织性和可读性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM