Adding description for testcases - compute part8

When Tempest is used in customer site, often we are required to
provide a testcase list including testcase names and descriptions.
Now no this kind of doc is available, so we can add descriptions
with the format of doc string for every testcase, so later we
can generata such a testcase description list.

There are hundreds of testcases missing descriptions, so we can
add them gradually, and limit the modified files in one patch
for the convenience of reviewing.

Change-Id: I858158cf4fb5e75208177f2c49b4e7f350f09a1e
partially-implements: blueprint testcase-description
This commit is contained in:
zhufl 2020-08-12 15:36:31 +08:00
parent 24961f6244
commit e4fb4229c9
10 changed files with 140 additions and 47 deletions

View File

@ -22,6 +22,7 @@ CONF = config.CONF
class ImagesOneServerTestJSON(base.BaseV2ComputeTest):
"""Test server images API"""
@classmethod
def resource_setup(cls):
@ -54,6 +55,7 @@ class ImagesOneServerTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('3731d080-d4c5-4872-b41a-64d0d0021314')
def test_create_delete_image(self):
"""Test create/delete server image"""
if self.is_requested_microversion_compatible('2.35'):
MIN_DISK = 'minDisk'
MIN_RAM = 'minRam'
@ -93,6 +95,7 @@ class ImagesOneServerTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('3b7c6fe4-dfe7-477c-9243-b06359db51e6')
def test_create_image_specify_multibyte_character_image_name(self):
"""Test creating server image with multibyte character image name"""
# prefix character is:
# http://unicode.org/cldr/utility/character.jsp?a=20A1

View File

@ -30,6 +30,8 @@ LOG = logging.getLogger(__name__)
class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
"""Negative tests of server images"""
create_default_network = True
def tearDown(self):
@ -87,7 +89,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('55d1d38c-dd66-4933-9c8e-7d92aeb60ddc')
def test_create_image_specify_invalid_metadata(self):
# Return an error when creating image with invalid metadata
"""Test creating server image with invalid metadata should fail"""
meta = {'': ''}
self.assertRaises(lib_exc.BadRequest, self.create_image_from_server,
self.server_id, metadata=meta)
@ -95,7 +97,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('3d24d11f-5366-4536-bd28-cff32b748eca')
def test_create_image_specify_metadata_over_limits(self):
# Return an error when creating image with meta data over 255 chars
"""Test creating server image with metadata over 255 should fail"""
meta = {'a' * 256: 'b' * 256}
self.assertRaises(lib_exc.BadRequest, self.create_image_from_server,
self.server_id, metadata=meta)
@ -103,8 +105,11 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('0460efcf-ee88-4f94-acef-1bf658695456')
def test_create_second_image_when_first_image_is_being_saved(self):
# Disallow creating another image when first image is being saved
"""Test creating another server image when first image is being saved
Creating another server image when first image is being saved is
not allowed.
"""
# Create first snapshot
image = self.create_image_from_server(self.server_id)
self.addCleanup(self._reset_server)
@ -123,8 +128,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('084f0cbc-500a-4963-8a4e-312905862581')
def test_create_image_specify_name_over_character_limit(self):
# Return an error if snapshot name over 255 characters is passed
"""Test creating server image with image name over 255 should fail"""
snapshot_name = ('a' * 256)
self.assertRaises(lib_exc.BadRequest,
self.compute_images_client.create_image,
@ -133,8 +137,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('0894954d-2db2-4195-a45b-ffec0bc0187e')
def test_delete_image_that_is_not_yet_active(self):
# Return an error while trying to delete an image what is creating
"""Test deleting a non-active server image should fail"""
image = self.create_image_from_server(self.server_id)
if api_version_utils.compare_version_header_to_response(
"OpenStack-API-Version", "compute 2.45", image.response, "lt"):

View File

@ -31,6 +31,8 @@ CONF = config.CONF
class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
"""Test listing server images with compute microversion less than 2.36"""
max_microversion = '2.35'
@classmethod
@ -129,8 +131,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('a3f5b513-aeb3-42a9-b18e-f091ef73254d')
def test_list_images_filter_by_status(self):
# The list of images should contain only images with the
# provided status
"""Test listing server images filtered by image status
The list of images should contain only images with the
provided image status.
"""
params = {'status': 'ACTIVE'}
images = self.client.list_images(**params)['images']
@ -140,8 +145,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('33163b73-79f5-4d07-a7ea-9213bcc468ff')
def test_list_images_filter_by_name(self):
# List of all images should contain the expected images filtered
# by name
"""Test listing server images filtered by image name
The list of images should contain only images with the
provided image name.
"""
params = {'name': self.image1['name']}
images = self.client.list_images(**params)['images']
@ -153,7 +161,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
'Snapshotting is not available.')
def test_list_images_filter_by_server_id(self):
# The images should contain images filtered by server id
"""Test listing images filtered by server id
The list of images should contain only images with the
provided server id.
"""
params = {'server': self.server1['id']}
images = self.client.list_images(**params)['images']
@ -169,7 +181,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
'Snapshotting is not available.')
def test_list_images_filter_by_server_ref(self):
# The list of servers should be filtered by server ref
"""Test listing images filtered by server link href
The list of images should contain only images with the
provided server link href.
"""
server_links = self.server2['links']
# Try all server link types
@ -188,7 +204,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
'Snapshotting is not available.')
def test_list_images_filter_by_type(self):
# The list of servers should be filtered by image type
"""Test listing images filtered by image type
The list of images should contain only images with the
provided image type.
"""
params = {'type': 'snapshot'}
images = self.client.list_images(**params)['images']
@ -202,13 +222,22 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('3a484ca9-67ba-451e-b494-7fcf28d32d62')
def test_list_images_limit_results(self):
# Verify only the expected number of results are returned
"""Test listing images with limited count
If we use limit=1 when listing images, then only 1 image should be
returned.
"""
params = {'limit': '1'}
images = self.client.list_images(**params)['images']
self.assertEqual(1, len([x for x in images if 'id' in x]))
@decorators.idempotent_id('18bac3ae-da27-436c-92a9-b22474d13aab')
def test_list_images_filter_by_changes_since(self):
"""Test listing images filtered by changes-since
The list of images should contain only images updated since the
provided changes-since value.
"""
# Verify only updated images are returned in the detailed list
# Becoming ACTIVE will modify the updated time
@ -220,8 +249,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('9b0ea018-6185-4f71-948a-a123a107988e')
def test_list_images_with_detail_filter_by_status(self):
# Detailed list of all images should only contain images
# with the provided status
"""Test listing server images details filtered by image status
The list of images should contain only images with the
provided image status.
"""
params = {'status': 'ACTIVE'}
images = self.client.list_images(detail=True, **params)['images']
@ -231,8 +263,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('644ea267-9bd9-4f3b-af9f-dffa02396a17')
def test_list_images_with_detail_filter_by_name(self):
# Detailed list of all images should contain the expected
# images filtered by name
"""Test listing server images details filtered by image name
The list of images should contain only images with the
provided image name.
"""
params = {'name': self.image1['name']}
images = self.client.list_images(detail=True, **params)['images']
@ -242,8 +277,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('ba2fa9a9-b672-47cc-b354-3b4c0600e2cb')
def test_list_images_with_detail_limit_results(self):
# Verify only the expected number of results (with full details)
# are returned
"""Test listing images details with limited count
If we use limit=1 when listing images with full details, then only 1
image should be returned.
"""
params = {'limit': '1'}
images = self.client.list_images(detail=True, **params)['images']
self.assertEqual(1, len(images))
@ -252,7 +290,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
'Snapshotting is not available.')
def test_list_images_with_detail_filter_by_server_ref(self):
# Detailed list of servers should be filtered by server ref
"""Test listing images details filtered by server link href
The list of images should contain only images with the
provided server link href.
"""
server_links = self.server2['links']
# Try all server link types
@ -271,7 +313,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@testtools.skipUnless(CONF.compute_feature_enabled.snapshot,
'Snapshotting is not available.')
def test_list_images_with_detail_filter_by_type(self):
# The detailed list of servers should be filtered by image type
"""Test listing images details filtered by image type
The list of images should contain only images with the
provided image type.
"""
params = {'type': 'snapshot'}
images = self.client.list_images(detail=True, **params)['images']
self.client.show_image(self.image_ref)
@ -286,8 +332,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('7d439e18-ac2e-4827-b049-7e18004712c4')
def test_list_images_with_detail_filter_by_changes_since(self):
# Verify an update image is returned
"""Test listing images details filtered by changes-since
The list of images should contain only images updated since the
provided changes-since value.
"""
# Becoming ACTIVE will modify the updated time
# Filter by the image's created time
params = {'changes-since': self.image1['created']}

View File

@ -22,6 +22,12 @@ CONF = config.CONF
class ListImageFiltersNegativeTestJSON(base.BaseV2ComputeTest):
"""Negative tests of listing images using compute images API
Negative tests of listing images using compute images API with
microversion less than 2.36.
"""
max_microversion = '2.35'
@classmethod
@ -39,7 +45,7 @@ class ListImageFiltersNegativeTestJSON(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('391b0440-432c-4d4b-b5da-c5096aa247eb')
def test_get_nonexistent_image(self):
# Check raises a NotFound
"""Test getting a non existent image should fail"""
nonexistent_image = data_utils.rand_uuid()
self.assertRaises(lib_exc.NotFound, self.client.show_image,
nonexistent_image)

View File

@ -19,6 +19,7 @@ from tempest.lib import decorators
class ServerAddressesTestJSON(base.BaseV2ComputeTest):
"""Test server addresses"""
create_default_network = True
@classmethod
@ -36,8 +37,10 @@ class ServerAddressesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('6eb718c0-02d9-4d5e-acd1-4e0c269cef39')
@utils.services('network')
def test_list_server_addresses(self):
# All public and private addresses for
# a server should be returned
"""Test listing server address
All public and private addresses for a server should be returned.
"""
addresses = self.client.list_addresses(self.server['id'])['addresses']
@ -51,8 +54,11 @@ class ServerAddressesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('87bbc374-5538-4f64-b673-2b0e4443cc30')
@utils.services('network')
def test_list_server_addresses_by_network(self):
# Providing a network type should filter
# the addresses return by that type
"""Test listing server addresses filtered by network addresses
Providing a network address should filter the addresses same with
the specified one.
"""
addresses = self.client.list_addresses(self.server['id'])['addresses']

View File

@ -32,11 +32,13 @@ from tempest.lib import decorators
class ServerShowV254Test(base.BaseV2ComputeTest):
"""Test servers API schema for compute microversion greater than 2.53"""
min_microversion = '2.54'
max_microversion = 'latest'
@decorators.idempotent_id('09170a98-4940-4637-add7-1a35121f1a5a')
def test_rebuild_server(self):
"""Test rebuilding server with microversion greater than 2.53"""
server = self.create_test_server(wait_until='ACTIVE')
keypair_name = data_utils.rand_name(
self.__class__.__name__ + '-keypair')
@ -52,11 +54,13 @@ class ServerShowV254Test(base.BaseV2ComputeTest):
class ServerShowV257Test(base.BaseV2ComputeTest):
"""Test servers API schema for compute microversion greater than 2.56"""
min_microversion = '2.57'
max_microversion = 'latest'
@decorators.idempotent_id('803df848-080a-4261-8f11-b020cd9b6f60')
def test_rebuild_server(self):
"""Test rebuilding server with microversion greater than 2.56"""
server = self.create_test_server(wait_until='ACTIVE')
user_data = "ZWNobyAiaGVsbG8gd29ybGQi"
# Checking rebuild API response schema

View File

@ -24,6 +24,7 @@ CONF = config.CONF
class VolumesSnapshotsTestJSON(base.BaseV2ComputeTest):
"""Test volume snapshots with compute microversion less than 2.36"""
# These tests will fail with a 404 starting from microversion 2.36. For
# more information, see:
@ -48,6 +49,7 @@ class VolumesSnapshotsTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('cd4ec87d-7825-450d-8040-6e2068f2da8f')
def test_volume_snapshot_create_get_list_delete(self):
"""Test create/get/list/delete volume snapshot"""
volume = self.create_volume()
self.addCleanup(self.delete_volume, volume['id'])

View File

@ -25,6 +25,7 @@ CONF = config.CONF
class VolumesGetTestJSON(base.BaseV2ComputeTest):
"""Test compute volumes API with microversion less than 2.36"""
# These tests will fail with a 404 starting from microversion 2.36. For
# more information, see:
@ -45,7 +46,7 @@ class VolumesGetTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('f10f25eb-9775-4d9d-9cbe-1cf54dae9d5f')
def test_volume_create_get_delete(self):
# CREATE, GET, DELETE Volume
"""Test create/get/delete volume"""
v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
metadata = {'Type': 'work'}
# Create volume

View File

@ -21,6 +21,8 @@ CONF = config.CONF
class VolumesTestJSON(base.BaseV2ComputeTest):
"""Test listing volumes with compute microversion less than 2.36"""
# NOTE: This test creates a number of 1G volumes. To run successfully,
# ensure that the backing file for the volume group that Nova uses
# has space for at least 3 1G volumes!
@ -57,7 +59,7 @@ class VolumesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('bc2dd1a0-15af-48e5-9990-f2e75a48325d')
def test_volume_list(self):
# Should return the list of Volumes
"""Test listing volumes should return all volumes"""
# Fetch all Volumes
fetched_list = self.client.list_volumes()['volumes']
# Now check if all the Volumes created in setup are in fetched list
@ -72,7 +74,7 @@ class VolumesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('bad0567a-5a4f-420b-851e-780b55bb867c')
def test_volume_list_with_details(self):
# Should return the list of Volumes with details
"""Test listing volumes with detail should return all volumes"""
# Fetch all Volumes
fetched_list = self.client.list_volumes(detail=True)['volumes']
# Now check if all the Volumes created in setup are in fetched list
@ -87,7 +89,11 @@ class VolumesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('1048ed81-2baf-487a-b284-c0622b86e7b8')
def test_volume_list_param_limit(self):
# Return the list of volumes based on limit set
"""Test listing volumes based on limit set
If we list volumes with limit=2, then only 2 volumes should be
returned.
"""
params = {'limit': 2}
fetched_vol_list = self.client.list_volumes(**params)['volumes']
@ -96,7 +102,11 @@ class VolumesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('33985568-4965-49d5-9bcc-0aa007ca5b7a')
def test_volume_list_with_detail_param_limit(self):
# Return the list of volumes with details based on limit set.
"""Test listing volumes with detail based on limit set
If we list volumes with detail with limit=2, then only 2 volumes with
detail should be returned.
"""
params = {'limit': 2}
fetched_vol_list = self.client.list_volumes(detail=True,
**params)['volumes']
@ -106,7 +116,12 @@ class VolumesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('51c22651-a074-4ea7-af0b-094f9331303e')
def test_volume_list_param_offset_and_limit(self):
# Return the list of volumes based on offset and limit set.
"""Test listing volumes based on offset and limit set
If we list volumes with offset=1 and limit=1, then 1 volume located
in the position 1 in the all volumes list should be returned.
(The items in the all volumes list start from position 0.)
"""
# get all volumes list
all_vol_list = self.client.list_volumes()['volumes']
params = {'offset': 1, 'limit': 1}
@ -123,7 +138,13 @@ class VolumesTestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('06b6abc4-3f10-48e9-a7a1-3facc98f03e5')
def test_volume_list_with_detail_param_offset_and_limit(self):
# Return the list of volumes details based on offset and limit set.
"""Test listing volumes with detail based on offset and limit set
If we list volumes with detail with offset=1 and limit=1, then 1
volume with detail located in the position 1 in the all volumes list
should be returned.
(The items in the all volumes list start from position 0.)
"""
# get all volumes list
all_vol_list = self.client.list_volumes(detail=True)['volumes']
params = {'offset': 1, 'limit': 1}

View File

@ -23,6 +23,7 @@ CONF = config.CONF
class VolumesNegativeTest(base.BaseV2ComputeTest):
"""Negative tests of volumes with compute microversion less than 2.36"""
# These tests will fail with a 404 starting from microversion 2.36. For
# more information, see:
@ -44,7 +45,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('c03ea686-905b-41a2-8748-9635154b7c57')
def test_volume_get_nonexistent_volume_id(self):
# Negative: Should not be able to get details of nonexistent volume
"""Test getting details of a non existent volume should fail"""
# Creating a nonexistent volume id
# Trying to GET a non existent volume
self.assertRaises(lib_exc.NotFound, self.client.show_volume,
@ -53,7 +54,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('54a34226-d910-4b00-9ef8-8683e6c55846')
def test_volume_delete_nonexistent_volume_id(self):
# Negative: Should not be able to delete nonexistent Volume
"""Test deleting a nonexistent volume should fail"""
# Creating nonexistent volume id
# Trying to DELETE a non existent volume
self.assertRaises(lib_exc.NotFound, self.client.delete_volume,
@ -62,8 +63,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('5125ae14-152b-40a7-b3c5-eae15e9022ef')
def test_create_volume_with_invalid_size(self):
# Negative: Should not be able to create volume with invalid size
# in request
"""Test creating volume with invalid size should fail"""
v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
metadata = {'Type': 'work'}
self.assertRaises(lib_exc.BadRequest, self.client.create_volume,
@ -72,8 +72,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('131cb3a1-75cc-4d40-b4c3-1317f64719b0')
def test_create_volume_without_passing_size(self):
# Negative: Should not be able to create volume without passing size
# in request
"""Test creating volume without specifying size should fail"""
v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
metadata = {'Type': 'work'}
self.assertRaises(lib_exc.BadRequest, self.client.create_volume,
@ -82,7 +81,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('8cce995e-0a83-479a-b94d-e1e40b8a09d1')
def test_create_volume_with_size_zero(self):
# Negative: Should not be able to create volume with size zero
"""Test creating volume with size=0 should fail"""
v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume')
metadata = {'Type': 'work'}
self.assertRaises(lib_exc.BadRequest, self.client.create_volume,
@ -91,14 +90,13 @@ class VolumesNegativeTest(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('62bab09a-4c03-4617-8cca-8572bc94af9b')
def test_get_volume_without_passing_volume_id(self):
# Negative: Should not be able to get volume when empty ID is passed
"""Test getting volume details without volume id should fail"""
self.assertRaises(lib_exc.NotFound, self.client.show_volume, '')
@decorators.attr(type=['negative'])
@decorators.idempotent_id('62972737-124b-4513-b6cf-2f019f178494')
def test_delete_invalid_volume_id(self):
# Negative: Should not be able to delete volume when invalid ID is
# passed
"""Test deleting volume with an invalid volume id should fail"""
self.assertRaises(lib_exc.NotFound,
self.client.delete_volume,
data_utils.rand_name('invalid'))
@ -106,5 +104,5 @@ class VolumesNegativeTest(base.BaseV2ComputeTest):
@decorators.attr(type=['negative'])
@decorators.idempotent_id('0d1417c5-4ae8-4c2c-adc5-5f0b864253e5')
def test_delete_volume_without_passing_volume_id(self):
# Negative: Should not be able to delete volume when empty ID is passed
"""Test deleting volume without volume id should fail"""
self.assertRaises(lib_exc.NotFound, self.client.delete_volume, '')