0

I am writing my first unittest in python I have already wrote a passing test with class and function but now I want to write unittest and it is failing as follow

import unittest
import requests
import time
import json
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class ChromeSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()
        driver = self.driver
        base_url = 'http://127.0.0.1:8080/'
        driver.get(base_url)

    def test_get_users(self):
        print("Planning to get users")
        token = test_generate_token()
        headers = {'Content-Type': 'application/json',
        'Token': token}

        r = requests.get('http://127.0.0.1:8080/api/users', headers=headers)
        print"Get request for api Users"
        print(r.text)

    def test_generate_token():
        print("Generating Token")
        usernameStr = 'user1a'
        passwordStr = 'user'
        response = requests.get('http://127.0.0.1:8080/api/auth/token', auth=(usernameStr, passwordStr))
        print(response)
        data = response.json()
        print(data)
        if response.status_code == 200 and data["status"] == "SUCCESS":
            token = data["token"]
        else:
            token = None
            print("The request was not successful.")
        print(token)
        return token



    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

so what I am doing is calling test_generate_token() from test_get_users(self) to get token and then using token to get users but it fails with following error

    Generating Token
<Response [200]>
{u'status': u'SUCCESS', u'token': u'OTEzMjQ0NjY1OTQ3NzM5OTYyMTczNTM0NzA4MjM0OTQ2NTQ5NDA='}
OTEzMjQ0NjY1OTQ3NzM5OTYyMTczNTM0NzA4MjM0OTQ2NTQ5NDA=
.
DevTools listening on ws://127.0.0.1:50610/devtools/browser/eb427541-898f-4c1d-938d-064462f50a68
Planning to get users
E
======================================================================
ERROR: test_get_users (__main__.ChromeSearch)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".\test_demo_app.py", line 18, in test_get_users
    token = test_generate_token()
NameError: global name 'test_generate_token' is not defined

I have tried to follow this Python: Passing variables between functions

Token Part is moved to Setup

import unittest
import requests
import time
import json
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class ChromeSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()
        driver = self.driver
        base_url = 'http://127.0.0.1:8080/'
        driver.get(base_url)
        print("Generating Token")
        usernameStr = 'user1a'
        passwordStr = 'user'
        response = requests.get('http://127.0.0.1:8080/api/auth/token', auth=(usernameStr, passwordStr))
        print(response)
        data = response.json()
        print(data)
        if response.status_code == 200 and data["status"] == "SUCCESS":
            token = data["token"]
        else:
            token = None
            print("The request was not successful.")
        print(token)

    def test_get_users(self):
        print("Planning to get users")
        headers = {'Content-Type': 'application/json',
        'Token': token}

        r = requests.get('http://127.0.0.1:8080/api/users', headers=headers)
        print"Get request for api Users"
        print(r.text)

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()
Sara
  • 181
  • 1
  • 3
  • 16

1 Answers1

2

Since test_generate_token is a member function, you need to call it as a member function.

token = self.test_generate_token().

Berislav Kovacki
  • 486
  • 4
  • 16
  • thankyou it worked, one more question what about my approach ? I called a function from another function to generate token and then used to to get users ? Because now I need the same Token to update a users information, how would I use the same token in some other method or should I generate a new token for each test ? – Sara Dec 08 '19 at 15:39
  • Approach is fine, you can remove test_ prefix from `test_generate_token` so that it is not called as a part of a test suite. Also, since it doesn't depend on instance variables, you can put it outside of the class. – Berislav Kovacki Dec 08 '19 at 15:45
  • You can generate a token in `setUp()` function, then reuse token in other tests in testsuite. – Berislav Kovacki Dec 08 '19 at 15:47
  • ok I jhave put Token generation part into setup and delete def token generation but when test_get_user was called it say token is not defined thos this token is now in setup part, did I do something wrong or did you mean something else ? you can see my new code above – Sara Dec 08 '19 at 16:03
  • ok it worked so that, I have defined token out of class and then it was accessible, I am not sure if its a good approach tho – Sara Dec 08 '19 at 16:14