From 6e27c2a3d05867464e4b886ec2da6fce981072eb Mon Sep 17 00:00:00 2001 From: Aanand Prasad Date: Tue, 25 Aug 2015 15:58:53 +0100 Subject: Run tests with pytest Signed-off-by: Aanand Prasad --- Makefile | 4 ++-- test-requirements.txt | 3 ++- tests/fake_api.py | 2 +- tests/test.py | 8 ++------ tests/utils_test.py | 6 +----- tox.ini | 6 +----- 6 files changed, 9 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index ce74974..c24cbc4 100644 --- a/Makefile +++ b/Makefile @@ -13,10 +13,10 @@ build-py3: test: unit-test integration-test unit-test-py3 integration-test-py3 unit-test: build - docker run docker-py python tests/test.py + docker run docker-py py.test tests/test.py unit-test-py3: build-py3 - docker run docker-py3 python tests/test.py + docker run docker-py3 py.test tests/test.py integration-test: build docker run -e NOT_ON_HOST=true -v `$(HOST_TMPDIR)`:/tmp -v /var/run/docker.sock:/var/run/docker.sock docker-py python tests/integration_test.py diff --git a/test-requirements.txt b/test-requirements.txt index 969f7a2..8461e36 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,2 +1,3 @@ mock==1.0.1 -coverage==3.7.1 +pytest==2.7.2 +pytest-cov==2.1.0 diff --git a/tests/fake_api.py b/tests/fake_api.py index 199b4f6..d663988 100644 --- a/tests/fake_api.py +++ b/tests/fake_api.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import fake_stat +from . import fake_stat CURRENT_VERSION = 'v1.19' diff --git a/tests/test.py b/tests/test.py index 00ef0d4..56f2825 100644 --- a/tests/test.py +++ b/tests/test.py @@ -27,7 +27,6 @@ import tarfile import tempfile import threading import time -import unittest import warnings import random @@ -35,8 +34,8 @@ import docker import requests import six -import base -import fake_api +from . import base +from . import fake_api try: from unittest import mock @@ -2331,6 +2330,3 @@ class StreamTest(Cleanup, base.BaseTestCase): self.assertEqual(list(stream), [ str(i).encode() for i in range(50)]) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/utils_test.py b/tests/utils_test.py index 91d676f..b641004 100644 --- a/tests/utils_test.py +++ b/tests/utils_test.py @@ -1,6 +1,5 @@ import os import os.path -import unittest import tempfile from docker.client import Client @@ -13,7 +12,7 @@ from docker.utils import ( from docker.utils.ports import build_port_bindings, split_port from docker.auth import resolve_repository_name, resolve_authconfig -import base +from . import base class UtilsTest(base.BaseTestCase): @@ -474,6 +473,3 @@ class UtilsTest(base.BaseTestCase): ["127.0.0.1:1000:1000", "127.0.0.1:2000:2000"]) self.assertEqual(port_bindings["1000"], [("127.0.0.1", "1000")]) self.assertEqual(port_bindings["2000"], [("127.0.0.1", "2000")]) - -if __name__ == '__main__': - unittest.main() diff --git a/tox.ini b/tox.ini index 10b9df9..eb31bee 100644 --- a/tox.ini +++ b/tox.ini @@ -5,11 +5,7 @@ skipsdist=True [testenv] usedevelop=True commands = - {envbindir}/coverage run -p tests/test.py - {envbindir}/coverage run -p tests/utils_test.py - {envbindir}/coverage combine - {envbindir}/coverage report - {envbindir}/coverage html + py.test --cov=docker tests/test.py tests/utils_test.py deps = -r{toxinidir}/test-requirements.txt -r{toxinidir}/requirements.txt -- cgit v1.2.1 From d5bcdaf2f84f397db0f67343fffa02b6bede0cb0 Mon Sep 17 00:00:00 2001 From: Aanand Prasad Date: Tue, 25 Aug 2015 16:23:12 +0100 Subject: Use pytest helpers to assert exceptions and deprecated warnings Signed-off-by: Aanand Prasad --- tests/test.py | 311 +++++++++++++++++----------------------------------- tests/utils_test.py | 11 +- 2 files changed, 104 insertions(+), 218 deletions(-) diff --git a/tests/test.py b/tests/test.py index 56f2825..da4d34d 100644 --- a/tests/test.py +++ b/tests/test.py @@ -27,7 +27,6 @@ import tarfile import tempfile import threading import time -import warnings import random import docker @@ -37,6 +36,8 @@ import six from . import base from . import fake_api +import pytest + try: from unittest import mock except ImportError: @@ -45,9 +46,6 @@ except ImportError: DEFAULT_TIMEOUT_SECONDS = docker.client.constants.DEFAULT_TIMEOUT_SECONDS -warnings.simplefilter('error') -warnings.filterwarnings('error') - def response(status_code=200, content='', headers=None, reason=None, elapsed=0, request=None): @@ -137,15 +135,13 @@ class DockerClientTest(Cleanup, base.BaseTestCase): } def test_ctor(self): - try: + with pytest.raises(docker.errors.DockerException) as excinfo: docker.Client(version=1.12) - except Exception as e: - self.assertTrue(isinstance(e, docker.errors.DockerException)) - if not six.PY3: - self.assertEqual( - str(e), - 'Version parameter must be a string or None. Found float' - ) + + self.assertEqual( + str(excinfo.value), + 'Version parameter must be a string or None. Found float' + ) ######################### # INFORMATION TESTS # @@ -186,11 +182,9 @@ class DockerClientTest(Cleanup, base.BaseTestCase): ) def test_image_viz(self): - try: + with pytest.raises(Exception): self.client.images('busybox', viz=True) self.fail('Viz output should not be supported!') - except Exception: - pass def test_events(self): self.client.events() @@ -614,19 +608,21 @@ class DockerClientTest(Cleanup, base.BaseTestCase): ) def test_start_container_none(self): - try: + with pytest.raises(ValueError) as excinfo: self.client.start(container=None) - except ValueError as e: - self.assertEqual(str(e), 'image or container param is undefined') - else: - self.fail('Command should raise ValueError') - try: + self.assertEqual( + str(excinfo.value), + 'image or container param is undefined', + ) + + with pytest.raises(ValueError) as excinfo: self.client.start(None) - except ValueError as e: - self.assertEqual(str(e), 'image or container param is undefined') - else: - self.fail('Command should raise ValueError') + + self.assertEqual( + str(excinfo.value), + 'image or container param is undefined', + ) def test_start_container_regression_573(self): self.client.start(**{'container': fake_api.FAKE_CONTAINER_ID}) @@ -764,7 +760,7 @@ class DockerClientTest(Cleanup, base.BaseTestCase): ) def test_create_container_with_binds_mode_and_ro_error(self): - try: + with pytest.raises(ValueError): mount_dest = '/mnt' mount_origin = '/tmp' self.client.create_container( @@ -776,10 +772,6 @@ class DockerClientTest(Cleanup, base.BaseTestCase): }} ) ) - except ValueError: - return - - self.fail('Command should raise ValueError') def test_create_container_with_binds_list(self): self.client.create_container( @@ -961,192 +953,93 @@ class DockerClientTest(Cleanup, base.BaseTestCase): ) def test_start_container_with_lxc_conf(self): - if six.PY2: - try: - self.client.start( - fake_api.FAKE_CONTAINER_ID, - lxc_conf={'lxc.conf.k': 'lxc.conf.value'} - ) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start( - fake_api.FAKE_CONTAINER_ID, - lxc_conf={'lxc.conf.k': 'lxc.conf.value'} - ) + def call_start(): + self.client.start( + fake_api.FAKE_CONTAINER_ID, + lxc_conf={'lxc.conf.k': 'lxc.conf.value'} + ) + + pytest.deprecated_call(call_start) def test_start_container_with_lxc_conf_compat(self): - if six.PY2: - try: - self.client.start( - fake_api.FAKE_CONTAINER_ID, - lxc_conf=[{'Key': 'lxc.conf.k', 'Value': 'lxc.conf.value'}] - ) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start( - fake_api.FAKE_CONTAINER_ID, - lxc_conf=[{'Key': 'lxc.conf.k', 'Value': 'lxc.conf.value'}] - ) + def call_start(): + self.client.start( + fake_api.FAKE_CONTAINER_ID, + lxc_conf=[{'Key': 'lxc.conf.k', 'Value': 'lxc.conf.value'}] + ) - def test_start_container_with_binds_ro(self): - mount_dest = '/mnt' - mount_origin = '/tmp' + pytest.deprecated_call(call_start) - if six.PY2: - try: - self.client.start( - fake_api.FAKE_CONTAINER_ID, binds={ - mount_origin: { - "bind": mount_dest, - "ro": True - } - } - ) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start( - fake_api.FAKE_CONTAINER_ID, binds={ - mount_origin: { - "bind": mount_dest, - "ro": True - } + def test_start_container_with_binds_ro(self): + def call_start(): + self.client.start( + fake_api.FAKE_CONTAINER_ID, binds={ + '/tmp': { + "bind": '/mnt', + "ro": True } - ) + } + ) + + pytest.deprecated_call(call_start) def test_start_container_with_binds_rw(self): - mount_dest = '/mnt' - mount_origin = '/tmp' - if six.PY2: - try: - self.client.start( - fake_api.FAKE_CONTAINER_ID, binds={ - mount_origin: {"bind": mount_dest, "ro": False} - } - ) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start( - fake_api.FAKE_CONTAINER_ID, binds={ - mount_origin: {"bind": mount_dest, "ro": False} - } - ) + def call_start(): + self.client.start( + fake_api.FAKE_CONTAINER_ID, binds={ + '/tmp': {"bind": '/mnt', "ro": False} + } + ) + + pytest.deprecated_call(call_start) def test_start_container_with_port_binds(self): self.maxDiff = None - if six.PY2: - try: - self.client.start(fake_api.FAKE_CONTAINER_ID, port_bindings={ - 1111: None, - 2222: 2222, - '3333/udp': (3333,), - 4444: ('127.0.0.1',), - 5555: ('127.0.0.1', 5555), - 6666: [('127.0.0.1',), ('192.168.0.1',)] - }) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start(fake_api.FAKE_CONTAINER_ID, port_bindings={ - 1111: None, - 2222: 2222, - '3333/udp': (3333,), - 4444: ('127.0.0.1',), - 5555: ('127.0.0.1', 5555), - 6666: [('127.0.0.1',), ('192.168.0.1',)] - }) + + def call_start(): + self.client.start(fake_api.FAKE_CONTAINER_ID, port_bindings={ + 1111: None, + 2222: 2222, + '3333/udp': (3333,), + 4444: ('127.0.0.1',), + 5555: ('127.0.0.1', 5555), + 6666: [('127.0.0.1',), ('192.168.0.1',)] + }) + + pytest.deprecated_call(call_start) def test_start_container_with_links(self): - # one link - link_path = 'path' - alias = 'alias' + def call_start(): + self.client.start( + fake_api.FAKE_CONTAINER_ID, links={'path': 'alias'} + ) - if six.PY2: - try: - self.client.start(fake_api.FAKE_CONTAINER_ID, - links={link_path: alias}) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start( - fake_api.FAKE_CONTAINER_ID, links={link_path: alias} - ) + pytest.deprecated_call(call_start) def test_start_container_with_multiple_links(self): - link_path = 'path' - alias = 'alias' - if six.PY2: - try: - self.client.start( - fake_api.FAKE_CONTAINER_ID, - links={ - link_path + '1': alias + '1', - link_path + '2': alias + '2' - } - ) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start( - fake_api.FAKE_CONTAINER_ID, - links={ - link_path + '1': alias + '1', - link_path + '2': alias + '2' - } - ) + def call_start(): + self.client.start( + fake_api.FAKE_CONTAINER_ID, + links={ + 'path1': 'alias1', + 'path2': 'alias2' + } + ) + + pytest.deprecated_call(call_start) def test_start_container_with_links_as_list_of_tuples(self): - # one link - link_path = 'path' - alias = 'alias' - if six.PY2: - try: - self.client.start(fake_api.FAKE_CONTAINER_ID, - links=[(link_path, alias)]) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start(fake_api.FAKE_CONTAINER_ID, - links=[(link_path, alias)]) + def call_start(): + self.client.start(fake_api.FAKE_CONTAINER_ID, + links=[('path', 'alias')]) + + pytest.deprecated_call(call_start) def test_start_container_privileged(self): - if six.PY2: - try: - self.client.start(fake_api.FAKE_CONTAINER_ID, privileged=True) - except DeprecationWarning: - return - else: - self.fail('Expected a DeprecationWarning') - else: - with self.assertWarns(DeprecationWarning): - self.client.start(fake_api.FAKE_CONTAINER_ID, privileged=True) + def call_start(): + self.client.start(fake_api.FAKE_CONTAINER_ID, privileged=True) + + pytest.deprecated_call(call_start) def test_start_container_with_dict_instead_of_id(self): self.client.start({'Id': fake_api.FAKE_CONTAINER_ID}) @@ -1715,14 +1608,12 @@ class DockerClientTest(Cleanup, base.BaseTestCase): def test_inspect_container_undefined_id(self): for arg in None, '', {True: True}: - try: + with pytest.raises(docker.errors.NullResource) as excinfo: self.client.inspect_container(arg) - except docker.errors.NullResource as e: - self.assertEqual( - e.args[0], 'image or container param is undefined' - ) - else: - self.fail('Command expected NullResource exception') + + self.assertEqual( + excinfo.value.args[0], 'image or container param is undefined' + ) def test_container_stats(self): self.client.stats(fake_api.FAKE_CONTAINER_ID) @@ -1868,14 +1759,12 @@ class DockerClientTest(Cleanup, base.BaseTestCase): def test_inspect_image_undefined_id(self): for arg in None, '', {True: True}: - try: + with pytest.raises(docker.errors.NullResource) as excinfo: self.client.inspect_image(arg) - except docker.errors.NullResource as e: - self.assertEqual( - e.args[0], 'image or container param is undefined' - ) - else: - self.fail('Command expected NullResource exception') + + self.assertEqual( + excinfo.value.args[0], 'image or container param is undefined' + ) def test_insert_image(self): try: diff --git a/tests/utils_test.py b/tests/utils_test.py index b641004..f2a0fdc 100644 --- a/tests/utils_test.py +++ b/tests/utils_test.py @@ -14,6 +14,8 @@ from docker.auth import resolve_repository_name, resolve_authconfig from . import base +import pytest + class UtilsTest(base.BaseTestCase): longMessage = True @@ -79,13 +81,8 @@ class UtilsTest(base.BaseTestCase): } for host in invalid_hosts: - try: - parsed = parse_host(host) - self.fail('Expected to fail but success: %s -> %s' % ( - host, parsed - )) - except DockerException: - pass + with pytest.raises(DockerException): + parse_host(host) for host, expected in valid_hosts.items(): self.assertEqual(parse_host(host), expected, msg=host) -- cgit v1.2.1 From b5f1e64e8f18b313019fd47a431115cf881873e8 Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Tue, 25 Aug 2015 16:58:01 -0700 Subject: Ensure Makefile still run tests properly / tests are run in container as expected --- .dockerignore | 1 + Makefile | 8 ++++---- tests/integration_test.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.dockerignore b/.dockerignore index ababae3..c767879 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,6 +10,7 @@ dist .tox .coverage html/* +tests/__pycache__ # Compiled Documentation site/ diff --git a/Makefile b/Makefile index c24cbc4..70ee843 100644 --- a/Makefile +++ b/Makefile @@ -13,13 +13,13 @@ build-py3: test: unit-test integration-test unit-test-py3 integration-test-py3 unit-test: build - docker run docker-py py.test tests/test.py + docker run docker-py py.test tests/test.py tests/utils_test.py unit-test-py3: build-py3 - docker run docker-py3 py.test tests/test.py + docker run docker-py3 py.test tests/test.py tests/utils_test.py integration-test: build - docker run -e NOT_ON_HOST=true -v `$(HOST_TMPDIR)`:/tmp -v /var/run/docker.sock:/var/run/docker.sock docker-py python tests/integration_test.py + docker run -e NOT_ON_HOST=true -v `$(HOST_TMPDIR)`:/tmp -v /var/run/docker.sock:/var/run/docker.sock docker-py py.test tests/integration_test.py integration-test-py3: build-py3 - docker run -e NOT_ON_HOST=true -v `$(HOST_TMPDIR)`:/tmp -v /var/run/docker.sock:/var/run/docker.sock docker-py3 python tests/integration_test.py + docker run -e NOT_ON_HOST=true -v `$(HOST_TMPDIR)`:/tmp -v /var/run/docker.sock:/var/run/docker.sock docker-py3 py.test tests/integration_test.py diff --git a/tests/integration_test.py b/tests/integration_test.py index c1e6d30..815cd37 100644 --- a/tests/integration_test.py +++ b/tests/integration_test.py @@ -33,7 +33,7 @@ import six from six.moves import BaseHTTPServer from six.moves import socketserver -from test import Cleanup +from .test import Cleanup # FIXME: missing tests for # export; history; insert; port; push; tag; get; load; stats -- cgit v1.2.1