summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pymemcache/test/benchmark.py96
-rw-r--r--pymemcache/test/conftest.py18
-rw-r--r--pymemcache/test/test_benchmark.py78
-rw-r--r--setup.cfg1
4 files changed, 97 insertions, 96 deletions
diff --git a/pymemcache/test/benchmark.py b/pymemcache/test/benchmark.py
deleted file mode 100644
index 2fbda51..0000000
--- a/pymemcache/test/benchmark.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright 2012 Pinterest.com
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import argparse
-import time
-
-
-def test_client(name, client, size, count):
- client.flush_all()
-
- value = 'X' * size
-
- start = time.time()
-
- for i in range(count):
- client.set(str(i), value)
-
- for i in range(count):
- client.get(str(i))
-
- duration = time.time() - start
- print("{0}: {1}".format(name, duration))
-
-
-def test_pylibmc(host, port, size, count):
- try:
- import pylibmc
- except Exception:
- print("Could not import pylibmc, skipping test...")
- return
-
- client = pylibmc.Client(['{0}:{1}'.format(host, port)])
- client.behaviors = {"tcp_nodelay": True}
- test_client('pylibmc', client, size, count)
-
-
-def test_memcache(host, port, size, count):
- try:
- import memcache
- except Exception:
- print("Could not import pymemcache.client, skipping test...")
- return
-
- client = memcache.Client(['{0}:{1}'.format(host, port)])
- test_client('memcache', client, size, count)
-
-
-def test_pymemcache(host, port, size, count):
- try:
- import pymemcache.client
- except Exception:
- print("Could not import pymemcache.client, skipping test...")
- return
-
- client = pymemcache.client.Client((host, port))
- test_client('pymemcache', client, size, count)
-
-
-def main():
- parser = argparse.ArgumentParser()
- parser.add_argument('-s', '--server',
- metavar='HOST',
- required=True)
- parser.add_argument('-p', '--port',
- metavar='PORT',
- type=int,
- required=True)
- parser.add_argument('-z', '--size',
- metavar='SIZE',
- default=1024,
- type=int)
- parser.add_argument('-c', '--count',
- metavar='COUNT',
- default=10000,
- type=int)
-
- args = parser.parse_args()
-
- test_pylibmc(args.server, args.port, args.size, args.count)
- test_memcache(args.server, args.port, args.size, args.count)
- test_pymemcache(args.server, args.port, args.size, args.count)
-
-
-if __name__ == '__main__':
- main()
diff --git a/pymemcache/test/conftest.py b/pymemcache/test/conftest.py
index 8792cc3..369c2fd 100644
--- a/pymemcache/test/conftest.py
+++ b/pymemcache/test/conftest.py
@@ -11,6 +11,14 @@ def pytest_addoption(parser):
default='11211',
help='memcached server port')
+ parser.addoption('--size', action='store',
+ default=1024,
+ help='size of data in benchmarks')
+
+ parser.addoption('--count', action='store',
+ default=10000,
+ help='amount of values to use in benchmarks')
+
@pytest.fixture(scope='session')
def host(request):
@@ -22,6 +30,16 @@ def port(request):
return int(request.config.option.port)
+@pytest.fixture(scope='session')
+def size(request):
+ return int(request.config.option.size)
+
+
+@pytest.fixture(scope='session')
+def count(request):
+ return int(request.config.option.count)
+
+
def pytest_generate_tests(metafunc):
if 'socket_module' in metafunc.fixturenames:
socket_modules = [socket]
diff --git a/pymemcache/test/test_benchmark.py b/pymemcache/test/test_benchmark.py
new file mode 100644
index 0000000..984376f
--- /dev/null
+++ b/pymemcache/test/test_benchmark.py
@@ -0,0 +1,78 @@
+# Copyright 2012 Pinterest.com
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import argparse
+import time
+import pytest
+
+try:
+ import pylibmc
+ HAS_PYLIBMC = True
+except Exception:
+ HAS_PYLIBMC = False
+
+try:
+ import memcache
+ HAS_MEMCACHE = True
+except Exception:
+ HAS_MEMCACHE = False
+
+
+try:
+ import pymemcache.client
+ HAS_PYMEMCACHE = True
+except Exception:
+ HAS_PYMEMCACHE = False
+
+
+def run_client_test(name, client, size, count):
+ client.flush_all()
+
+ value = 'X' * size
+
+ start = time.time()
+
+ for i in range(count):
+ client.set(str(i), value)
+
+ for i in range(count):
+ client.get(str(i))
+
+ duration = time.time() - start
+ print("{0}: {1}".format(name, duration))
+
+
+@pytest.mark.benchmark()
+@pytest.mark.skipif(not HAS_PYLIBMC,
+ reason="requires pylibmc")
+def test_pylibmc(host, port, size, count):
+ client = pylibmc.Client(['{0}:{1}'.format(host, port)])
+ client.behaviors = {"tcp_nodelay": True}
+ run_client_test('pylibmc', client, size, count)
+
+
+@pytest.mark.benchmark()
+@pytest.mark.skipif(not HAS_MEMCACHE,
+ reason="requires python-memcached")
+def test_memcache(host, port, size, count):
+ client = memcache.Client(['{0}:{1}'.format(host, port)])
+ run_client_test('memcache', client, size, count)
+
+
+@pytest.mark.benchmark()
+@pytest.mark.skipif(not HAS_PYMEMCACHE,
+ reason="requires pymemcache")
+def test_pymemcache(host, port, size, count):
+ client = pymemcache.client.Client((host, port))
+ run_client_test('pymemcache', client, size, count)
diff --git a/setup.cfg b/setup.cfg
index 3d3ac4e..fe3e1c5 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -16,6 +16,7 @@ addopts =
markers =
unit
integration
+ benchmark
[flake8]
show-source = True