Custom Search
Showing posts with label OpenStack Unit Test. Show all posts
Showing posts with label OpenStack Unit Test. Show all posts

Monday, December 8, 2014

Setting Up OpenStack Python Client Development Environment

1)
Clone the Project

#git clone https://github.com/openstack/python-keystoneclient.git

2)
Goto cloned directory

#cd python-keystoneclient



3)
Setup the Environment


3,a)
With run_tests.sh

#./run_tests.sh

OR

3,b)
With tox

#sudo pip install tox
#tox

4)
Run the client commands


4,a)
With run_tests.sh Environment


4,a,a)Goto cloned directory
#cd python-keystoneclient

4,a,b)
Create a script named "keystone" with following statements in cloned directory.
#vim keystone

#!/usr/bin/python
# PBR Generated from 'console_scripts'
import sys
from keystoneclient.shell import main
if __name__ == "__main__":
    sys.exit(main())


4,a,c)
Run the keystone client commands from run_tests.sh Environment
#source .venv/bin/activate
#.venv/bin/python keystone tenant-list
#.venv/bin/python keystone user-list


OR

4,b)
With Tox Environment

4,b,a)
Goto cloned directory
#cd python-keystoneclient

4,b,b)
Create a script named "keystone" with following statements in cloned directory.
#vim keystone

#!/usr/bin/python
# PBR Generated from 'console_scripts'
import sys
from keystoneclient.shell import main
if __name__ == "__main__":
    sys.exit(main())


4,b,c)
Run the keystone client commands from Tox Environment
#source .tox/py27/bin/activate
#.tox/py27/bin/python keystone tenant-list
#.tox/py27/bin/python keystone user-list


5)
Run the Tests


5,a)
With run_tests.sh
#./run_tests.sh --debug keystoneclient.tests.v2_0.test_tenants.TenantTests.test_list

##Only pep8 test
#./run_tests.sh --debug --pep8 keystoneclient.tests.v2_0.test_tenants

##manual pep8 test with the wrapper flake8
#source .venv/bin/activate
#flake8 keystoneclient/tests/v2_0/test_tenants.py


OR

5,b)
With tox


* Deactivate virtualenv (Important), then run tox command , otherwise tox command will try to recreate the virtualenv from scratch
#deactivate

*UnitTest
#tox -e py27 -- keystoneclient.tests.v2_0.test_tenants.TenantTests.test_list
#tox -e py27 -- keystoneclient.tests.v2_0.test_tenants
#tox -e py27

*pep8 test
#tox -e pep8 -- keystoneclient.tests.v2_0.test_tenants
#tox -e pep8

http://fosshelp.blogspot.in/2014/11/openstack-unit-testing-tox-runtestssh.html







Thursday, December 4, 2014

OpenStack Debug Python Unit Test using pdb

1)
Add following statements in Unit Test Code where you want to debug

import pdb
pdb.set_trace()




2)
Run "run_tests.sh" with "--debug" option

#./run_tests.sh --debug neutron.tests.unit.opencontrail.test_extension_ipam.IpamExtensionTestCase.test_create_ipam

OR

Run the test with "testtools" instead of "testr"

a)
If you are using "run_tests.sh" environment
#source .venv/bin/activate
#.venv/bin/python -m testtools.run neutron.tests.unit.opencontrail.test_extension_ipam.IpamExtensionTestCase.test_create_ipam

b)
If you are using "Tox" environment
#source .tox/py27/bin/activate
#.tox/py27/bin/python -m testtools.run neutron.tests.unit.opencontrail.test_extension_ipam.IpamExtensionTestCase.test_create_ipam


Friday, January 10, 2014

Openstack Project Python Keystoneclient Unit Test Tutorial Part2

1)
First go through following Doc
https://github.com/gabrielfalcao/HTTPretty

Try to understand following things
a)
@httpretty.activate

b)
httpretty.register_uri()
c)
requests.get()
requests.post()

d)
response.text
response.json()

e)
httpretty.last_request()

2)
Check the Output of following httpretty example Programs


import requests
import httpretty


a)
def test_one():
    httpretty.enable()
    test_url = "http://192.168.56.101:5000/v3/"
    httpretty.register_uri(httpretty.GET, test_url,
                           body='{"success":"true"}',
                           content_type='text/json')
    response = requests.get(test_url)
    print "\n===response===", response
    print "\n====response.json()========", response.json()
    print "\n====response.text========", response.text
    last_req = httpretty.last_request()
    print "\n===last_req===", last_req
    httpretty.disable()


OutPut
=======

===response===
====response.json()======== {u'success': u'true'}
====response.text======== {"success":"true"}
===last_req===

b)
def test_two():
    httpretty.enable()
    test_url = "http://192.168.56.101:5000/v3/"
    httpretty.register_uri(httpretty.POST, test_url,
                           body='{"success":"true"}',
                           content_type='text/json')
    response = requests.post(test_url, data={1:1}, headers={'content-type': 'text/json'})
    print "\n===response===", response
    print "\n====response.json()========", response.json()
    print "\n====response.text========", response.text
    last_req = httpretty.last_request()
    print "\n===last_req===", last_req.body
    httpretty.disable()


OutPut
=======

===response===
====response.json()======== {u'success': u'true'}
====response.text======== {"success":"true"}
===last_req=== 1=1

3)
Compare example httpretty Programs with keystoneclient test util


a)
Example of httpretty Program


@httpretty.activate
def test_two():
    test_url = "http://192.168.56.101:5000/v3/"
    httpretty.register_uri(httpretty.POST, test_url,
                           body='{"success":"true"}',
                           content_type='text/json')
    response = requests.post(test_url, data={1:1}, headers={'content-type': 'text/json'})
    last_req = httpretty.last_request()


b)
Example from keystoneclient test util

python-keystoneclient/keystoneclient/tests/v3/utils.py
 

@httpretty.activate
    def test_create(self, ref=None, req_ref=None):
    ###Similar to###httpretty.register_uri
    self.stub_entity(httpretty.POST, entity=req_ref, status=201)
    ###Similar to###response = requests.post() OR response = requests.get()
    returned = self.manager.create(**parameterize(manager_ref))
    ###Similar to###last_req = httpretty.last_request()
    self.assertEntityRequestBodyIs(req_ref)


4)
Important Methods from keystoneclient test util


a)

python-keystoneclient/keystoneclient/tests/utils.py

    def assertRequestBodyIs(self, body=None, json=None):
        if json:
            val = jsonutils.loads(httpretty.last_request().body)
            self.assertEqual(json, val)
        elif body:
            self.assertEqual(body, httpretty.last_request().body)


b)
python-keystoneclient/keystoneclient/tests/v3/utils.py

    def stub_entity(self, method, parts=None, entity=None, id=None, **kwargs):
        if entity:
            entity = self.encode(entity)
            kwargs['json'] = entity

        if not parts:
            parts = [self.collection_key]

            if self.path_prefix:
                parts.insert(0, self.path_prefix)

        if id:
            if not parts:
                parts = []

            parts.append(id)

        self.stub_url(method, parts=parts, **kwargs)


c)
/python-keystoneclient/keystoneclient/tests/utils.py

    def stub_url(self, method, parts=None, base_url=None, json=None, **kwargs):
        if not base_url:
            base_url = self.TEST_URL

        if json:
            kwargs['body'] = jsonutils.dumps(json)
            kwargs['content_type'] = 'application/json'

        if parts:
            url = '/'.join([p.strip('/') for p in [base_url] + parts])
        else:
            url = base_url

        httpretty.register_uri(method, url, **kwargs)


d)
python-keystoneclient/keystoneclient/tests/v3/utils.py


@httpretty.activate
    def test_create(self, ref=None, req_ref=None):
    self.stub_entity(httpretty.POST, entity=req_ref, status=201)
    returned = self.manager.create(**parameterize(manager_ref))
    self.assertEntityRequestBodyIs(req_ref)



Part 1 .....



Friday, January 3, 2014

Openstack Project Python Keystoneclient Unit Test Tutorial Part1

1)
First go through following Doc
https://github.com/gabrielfalcao/HTTPretty

Try to understand following things
a)
@httpretty.activate

b)
httpretty.register_uri()
c)
requests.get()
requests.post()

d)
response.text
response.json()

e)
httpretty.last_request()


2)
Important Files


A)
./keystoneclient/tests/utils.py


import testtools

class TestCase(testtools.TestCase):
    TEST_DOMAIN_ID = '1'
    TEST_DOMAIN_NAME = 'aDomain'
    TEST_TENANT_ID = '1'
    TEST_TENANT_NAME = 'aTenant'
    TEST_TOKEN = 'aToken'
    TEST_TRUST_ID = 'aTrust'
    TEST_USER = 'test'
    TEST_ROOT_URL = 'http://127.0.0.1:5000/'

    def setUp(self):
        super(TestCase, self).setUp()

    def tearDown(self):
        super(TestCase, self).tearDown()

    def stub_url(self, method, parts=None, base_url=None, json=None, **kwargs):
    httpretty.register_uri(method, url, **kwargs)

    def assertRequestBodyIs(self, body=None, json=None):

    def assertRequestHeaderEqual(self, name, val):


B)
./keystoneclient/tests/v3/utils.py


from keystoneclient.tests import utils
from keystoneclient.v3 import client


class UnauthenticatedTestCase(utils.TestCase):

    """Class used as base for unauthenticated calls."""
    TEST_ROOT_URL = 'http://127.0.0.1:5000/'
    TEST_URL = '%s%s' % (TEST_ROOT_URL, 'v3')
    TEST_ROOT_ADMIN_URL = 'http://127.0.0.1:35357/'
    TEST_ADMIN_URL = '%s%s' % (TEST_ROOT_ADMIN_URL, 'v3')

class TestCase(UnauthenticatedTestCase):
    TEST_ADMIN_IDENTITY_ENDPOINT = "http://127.0.0.1:35357/v3"

    def setUp(self):
        super(TestCase, self).setUp()
        self.client = client.Client(username=self.TEST_USER,
                                    token=self.TEST_TOKEN,
                                    tenant_name=self.TEST_TENANT_NAME,
                                    auth_url=self.TEST_URL,
                                    endpoint=self.TEST_URL)


    def stub_auth(self, subject_token=None, **kwargs):
        if not subject_token:
            subject_token = self.TEST_TOKEN
        self.stub_url(httpretty.POST, ['auth', 'tokens'],
                      X_Subject_Token=subject_token, **kwargs)



class CrudTests(object):
    key = None
    collection_key = None
    model = None
    manager = None
    path_prefix = None

    def new_ref(self, **kwargs):
        kwargs.setdefault('id', uuid.uuid4().hex)
        return kwargs

    def stub_entity(self, method, parts=None, entity=None, id=None, **kwargs):
        if entity:
            entity = self.encode(entity)
            kwargs['json'] = entity

        if not parts:
            parts = [self.collection_key]

            if self.path_prefix:
                parts.insert(0, self.path_prefix)

        if id:
            if not parts:
                parts = []

            parts.append(id)

        self.stub_url(method, parts=parts, **kwargs)

    @httpretty.activate
    def test_create(self, ref=None, req_ref=None):

        ref = ref or self.new_ref()
        manager_ref = ref.copy()
        manager_ref.pop('id')

        # req_ref argument allows you to specify a different
        # signature for the request when the manager does some
        # conversion before doing the request (e.g converting
        # from datetime object to timestamp string)
        req_ref = req_ref or ref.copy()
        req_ref.pop('id')

        self.stub_entity(httpretty.POST, entity=req_ref, status=201)

        returned = self.manager.create(**parameterize(manager_ref))
        self.assertTrue(isinstance(returned, self.model))
        for attr in req_ref:
            self.assertEqual(
                getattr(returned, attr),
                req_ref[attr],
                'Expected different %s' % attr)
        self.assertEntityRequestBodyIs(req_ref)

C)
./keystoneclient/tests/v3/test_users.py


from keystoneclient.v3 import users
from keystoneclient.tests.v3 import utils

class UserTests(utils.TestCase, utils.CrudTests):
    def setUp(self):

        super(UserTests, self).setUp()
        self.key = 'user'
        self.collection_key = 'users'
        self.model = users.User
        self.manager = self.client.users

    def new_ref(self, **kwargs):
        kwargs = super(UserTests, self).new_ref(**kwargs)
        kwargs.setdefault('description', uuid.uuid4().hex)
        kwargs.setdefault('domain_id', uuid.uuid4().hex)
        kwargs.setdefault('enabled', True)
        kwargs.setdefault('name', uuid.uuid4().hex)
        kwargs.setdefault('default_project_id', uuid.uuid4().hex)
        return kwargs

    @httpretty.activate
    def test_add_user_to_group(self):

        group_id = uuid.uuid4().hex
        ref = self.new_ref()
        self.stub_url(httpretty.PUT,
                      ['groups', group_id, self.collection_key, ref['id']],
                      status=204)


        self.manager.add_to_group(user=ref['id'], group=group_id)
        self.assertRaises(exceptions.ValidationError,
                          self.manager.remove_from_group,
                          user=ref['id'],
                          group=None)

Part 2 ....