Skip to content

Commit 89e779b

Browse files
mgornyDreamsorcerer
authored andcommitted
Make aiomcache and redis deps optional for unit tests [WIP] (#725)
1 parent 37ce464 commit 89e779b

File tree

7 files changed

+65
-19
lines changed

7 files changed

+65
-19
lines changed

setup.cfg

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@ universal=1
55
max-line-length=100
66

77
[tool:pytest]
8-
addopts = --cov=aiocache --cov=tests/ --cov-report term
8+
addopts = --cov=aiocache --cov=tests/ --cov-report term --strict-markers
99
asyncio_mode = auto
1010
junit_suite_name = aiohttp_test_suite
1111
filterwarnings=
1212
error
1313
testpaths = tests/
1414
junit_family=xunit2
1515
xfail_strict = true
16+
markers =
17+
memcached: tests requiring memcached backend
18+
redis: tests requiring redis backend
1619

1720
[coverage:run]
1821
branch = True

tests/acceptance/conftest.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ async def memcached_cache():
4040
await asyncio.gather(*(cache.delete(k) for k in (*Keys, KEY_LOCK)))
4141

4242

43-
@pytest.fixture(params=("redis_cache", "memory_cache", "memcached_cache"))
43+
@pytest.fixture(
44+
params=(
45+
pytest.param("redis_cache", marks=pytest.mark.redis),
46+
"memory_cache",
47+
pytest.param("memcached_cache", marks=pytest.mark.memcached),
48+
))
4449
def cache(request):
4550
return request.getfixturevalue(request.param)

tests/acceptance/test_base.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
import pytest
44

5-
from aiocache.backends.memcached import MemcachedCache
65
from aiocache.backends.memory import SimpleMemoryCache
7-
from aiocache.backends.redis import RedisCache
86
from aiocache.base import _Conn
97
from ..utils import Keys
108

@@ -171,8 +169,11 @@ async def test_clear_with_namespace_memory(self, memory_cache):
171169
assert await memory_cache.exists(Keys.KEY, namespace="test") is False
172170

173171

172+
@pytest.mark.memcached
174173
class TestMemcachedCache:
175174
async def test_accept_explicit_args(self):
175+
from aiocache.backends.memcached import MemcachedCache
176+
176177
with pytest.raises(TypeError):
177178
MemcachedCache(random_attr="wtf")
178179

@@ -212,8 +213,11 @@ async def test_close(self, memcached_cache):
212213
assert memcached_cache.client._pool._pool.qsize() == 0
213214

214215

216+
@pytest.mark.redis
215217
class TestRedisCache:
216218
async def test_accept_explicit_args(self):
219+
from aiocache.backends.redis import RedisCache
220+
217221
with pytest.raises(TypeError):
218222
RedisCache(random_attr="wtf")
219223

tests/acceptance/test_factory.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import pytest
22

33
from aiocache import Cache
4-
from aiocache.backends.memcached import MemcachedCache
54
from aiocache.backends.memory import SimpleMemoryCache
6-
from aiocache.backends.redis import RedisCache
75

86

97
class TestCache:
@@ -15,7 +13,10 @@ def test_from_url_memory_no_endpoint(self):
1513
with pytest.raises(TypeError):
1614
Cache.from_url("memory://endpoint:10")
1715

16+
@pytest.mark.redis
1817
async def test_from_url_redis(self):
18+
from aiocache.backends.redis import RedisCache
19+
1920
url = ("redis://endpoint:1000/0/?password=pass"
2021
+ "&pool_max_size=50&create_connection_timeout=20")
2122

@@ -27,7 +28,10 @@ async def test_from_url_redis(self):
2728
assert cache.pool_max_size == 50
2829
assert cache.create_connection_timeout == 20
2930

31+
@pytest.mark.memcached
3032
async def test_from_url_memcached(self):
33+
from aiocache.backends.memcached import MemcachedCache
34+
3135
url = "memcached://endpoint:1000?pool_size=10"
3236

3337
async with Cache.from_url(url) as cache:
@@ -36,7 +40,12 @@ async def test_from_url_memcached(self):
3640
assert cache.port == 1000
3741
assert cache.pool_size == 10
3842

39-
@pytest.mark.parametrize("scheme", ("memory", "redis", "memcached"))
43+
@pytest.mark.parametrize(
44+
"scheme",
45+
(pytest.param("redis", marks=pytest.mark.redis),
46+
"memory",
47+
pytest.param("memcached", marks=pytest.mark.memcached),
48+
))
4049
def test_from_url_unexpected_param(self, scheme):
4150
with pytest.raises(TypeError):
4251
Cache.from_url("{}://?arg1=arg1".format(scheme))

tests/acceptance/test_lock.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ async def test_float_lease(self, memory_cache):
127127
assert await lock.__aexit__("exc_type", "exc_value", "traceback") is None
128128

129129

130+
@pytest.mark.redis
130131
class TestRedisRedLock:
131132
@pytest.fixture
132133
def lock(self, redis_cache):
@@ -160,6 +161,7 @@ async def test_float_lease(self, redis_cache):
160161
assert await lock.__aexit__("exc_type", "exc_value", "traceback") is None
161162

162163

164+
@pytest.mark.memcached
163165
class TestMemcachedRedLock:
164166
@pytest.fixture
165167
def lock(self, memcached_cache):
@@ -255,6 +257,7 @@ async def test_check_and_set_with_float_ttl(self, memory_cache, lock):
255257
assert await memory_cache.get(Keys.KEY) is None
256258

257259

260+
@pytest.mark.redis
258261
class TestRedisOptimisticLock:
259262
@pytest.fixture
260263
def lock(self, redis_cache):

tests/ut/conftest.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import pytest
66

77
from aiocache import caches
8-
from aiocache.backends.memcached import MemcachedCache
9-
from aiocache.backends.redis import RedisCache
108
from aiocache.base import BaseCache
119
from aiocache.plugins import BasePlugin
1210

@@ -54,11 +52,15 @@ def base_cache():
5452

5553
@pytest.fixture
5654
async def redis_cache():
55+
from aiocache.backends.redis import RedisCache
56+
5757
async with RedisCache() as cache:
5858
yield cache
5959

6060

6161
@pytest.fixture
6262
async def memcached_cache():
63+
from aiocache.backends.memcached import MemcachedCache
64+
6365
async with MemcachedCache() as cache:
6466
yield cache

tests/ut/test_factory.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,38 @@
33
import pytest
44

55
from aiocache import AIOCACHE_CACHES, Cache, caches
6-
from aiocache.backends.memcached import MemcachedCache
76
from aiocache.backends.memory import SimpleMemoryCache
8-
from aiocache.backends.redis import RedisCache
97
from aiocache.exceptions import InvalidCacheType
108
from aiocache.factory import _class_from_string, _create_cache
119
from aiocache.plugins import HitMissRatioPlugin, TimingPlugin
1210
from aiocache.serializers import JsonSerializer, PickleSerializer
1311

14-
assert Cache.REDIS is not None
15-
assert Cache.MEMCACHED is not None
16-
CACHE_NAMES = (Cache.MEMORY.NAME, Cache.REDIS.NAME, Cache.MEMCACHED.NAME)
1712

13+
CACHE_NAMES = [Cache.MEMORY.NAME]
1814

15+
try:
16+
from aiocache.backends.memcached import MemcachedCache
17+
except ImportError:
18+
MemcachedCache = None
19+
else:
20+
assert Cache.MEMCACHED is not None
21+
CACHE_NAMES.append(Cache.MEMCACHED.NAME)
22+
23+
try:
24+
from aiocache.backends.redis import RedisCache
25+
except ImportError:
26+
RedisCache = None
27+
else:
28+
assert Cache.REDIS is not None
29+
CACHE_NAMES.append(Cache.REDIS.NAME)
30+
31+
32+
@pytest.mark.redis
1933
def test_class_from_string():
2034
assert _class_from_string("aiocache.RedisCache") == RedisCache
2135

2236

37+
@pytest.mark.redis
2338
def test_create_simple_cache():
2439
redis = _create_cache(RedisCache, endpoint="127.0.0.10", port=6378)
2540

@@ -29,15 +44,15 @@ def test_create_simple_cache():
2944

3045

3146
def test_create_cache_with_everything():
32-
redis = _create_cache(
33-
RedisCache,
47+
cache = _create_cache(
48+
SimpleMemoryCache,
3449
serializer={"class": PickleSerializer, "encoding": "encoding"},
3550
plugins=[{"class": "aiocache.plugins.TimingPlugin"}],
3651
)
3752

38-
assert isinstance(redis.serializer, PickleSerializer)
39-
assert redis.serializer.encoding == "encoding"
40-
assert isinstance(redis.plugins[0], TimingPlugin)
53+
assert isinstance(cache.serializer, PickleSerializer)
54+
assert cache.serializer.encoding == "encoding"
55+
assert isinstance(cache.plugins[0], TimingPlugin)
4156

4257

4358
class TestCache:
@@ -164,6 +179,7 @@ def test_reuse_instance(self):
164179
def test_create_not_reuse(self):
165180
assert caches.create("default") is not caches.create("default")
166181

182+
@pytest.mark.redis
167183
def test_create_extra_args(self):
168184
caches.set_config(
169185
{
@@ -180,6 +196,7 @@ def test_create_extra_args(self):
180196
assert cache.endpoint == "127.0.0.10"
181197
assert cache.db == 10
182198

199+
@pytest.mark.redis
183200
def test_retrieve_cache(self):
184201
caches.set_config(
185202
{
@@ -209,6 +226,7 @@ def test_retrieve_cache(self):
209226
assert cache.serializer.encoding == "encoding"
210227
assert len(cache.plugins) == 2
211228

229+
@pytest.mark.redis
212230
def test_retrieve_cache_new_instance(self):
213231
caches.set_config(
214232
{
@@ -236,6 +254,7 @@ def test_retrieve_cache_new_instance(self):
236254
assert cache.serializer.encoding == "encoding"
237255
assert len(cache.plugins) == 2
238256

257+
@pytest.mark.redis
239258
def test_multiple_caches(self):
240259
caches.set_config(
241260
{
@@ -330,6 +349,7 @@ def test_set_config_no_default(self):
330349
}
331350
)
332351

352+
@pytest.mark.redis
333353
def test_ensure_plugins_order(self):
334354
caches.set_config(
335355
{

0 commit comments

Comments
 (0)