Search code examples
pythonpython-unittestweb-api-testing

Decorate two functions?


Is it possible to make such test cases shorter by using decorator or whatever else?

    def test_login_invalid_pwd(self):
        password = '12345'
        response = self._login(pwd=password)
        self.assertEqual(status_code, 200)
        self.assertEqual(response['resultText'],
                         'invalid password or login')
        self.assertEqual(response['resultCode'], 55)

    def test_web_login_invalid_login(self):
        login = 'my_1258@'
        response = self._login(login=login)
        self.assertEqual(status_code, 200)
        self.assertEqual(response['resultText'],
                         'invalid password or login')
        self.assertEqual(response['resultCode'], 55)

Solution

  • Yes. Try this:

    def helper(self, response):
        self.assertEqual(status_code, 200)
        self.assertEqual(response['resultText'],
                         'invalid password or login')
        self.assertEqual(response['resultCode'], 55)
    
    def test_login_invalid_pwd(self):
        password = '12345'
        response = self._login(pwd=password)
        self.helper(response)
    
    def test_web_login_invalid_login(self):
        login = 'my_1258@'
        response = self._login(login=login)
        self.helper(response)
    

    Or, depending on how granular your tests need to be, and assuming that your ._login() method uses None as defaults:

    def test_login_invalid(self):
        for login, pwd in (('my_1258@', None), (None, '12345')):
            response = self._login(login=login, pwd=pwd)
            self.assertEqual(status_code, 200)
            self.assertEqual(response['resultText'],
                             'invalid password or login')
            self.assertEqual(response['resultCode'], 55)