This commit is contained in:
Ryan Kelly 2011-12-07 23:36:27 +11:00
Родитель 11cb869819
Коммит 6bfddc7569
4 изменённых файлов: 86 добавлений и 62 удалений

Просмотреть файл

@ -17,12 +17,12 @@ port 8001 for use by the tests::
Confirm that your setup is working by running a single instance of the test
suite::
fl-run-test test_simple.py
fl-run-test test_sauropod.py
Then you can run the loadtest by doing::
fl-run-bench test_simple.py SimpleTest.test_write_and_read_keys
fl-run-bench test_sauropod.py SauropodTests.test_write_read_seq
And generate some pretty graphs with::
fl-build-report --html --output-directory=html simple-bench.xml
fl-build-report --html --output-directory=html sauropod-bench.xml

Просмотреть файл

@ -3,24 +3,24 @@
#
[main]
title=Sauropod Funkload test
description=simple Sauropod API tests
description=Simple loadtests for Sauropod HTTP server
url=http://localhost:8001
audience = http://sauropod.mozillalabs.com
num_users = 98
num_keys = 20
[test_write_and_read_keys]
[test_write_read_seq]
description=Sequential write of keys, then sequential read
num_keys = 20
# ------------------------------------------------------------
# Generic funkload configurtion
#
[ftest]
log_to = console file
log_path = simple-test.log
result_path = simple-test.xml
log_path = sauropod-test.log
result_path = sauropod-test.xml
sleep_time_min = 0
sleep_time_max = 0
@ -35,6 +35,6 @@ sleep_time = 0.01
cycle_time = 1
log_to =
log_path =
result_path = simple-bench.xml
result_path = sauropod-bench.xml
sleep_time_min = 0
sleep_time_max = 0.5

77
loadtest/test_sauropod.py Normal file
Просмотреть файл

@ -0,0 +1,77 @@
import unittest
import json
import random
from urllib import quote as urlquote
from urllib import unquote as urlunquote
from urlparse import urljoin
from funkload.FunkLoadTestCase import FunkLoadTestCase
from funkload.utils import Data
class SauropodTests(FunkLoadTestCase):
"""FunkLoad-based load tests for Sauropod HTTP server."""
def setUp(self):
self.root_url = self.conf_get("main", "url")
self.audience = self.conf_get("main", "audience")
self.num_users = int(self.conf_get("main", "num_users"))
self.userid = None
def tearDown(self):
self.userid = None
def start_session(self, userid=None):
if userid is None:
userid = "user%d@moz.com" % random.randint(0, self.num_users - 1)
params = {"audience": self.audience, "assertion": self.userid}
res = self.post(urljoin(self.root_url, "/session/start"),
params=params)
self.assertEquals(res.code, 200)
self.sessionid = res.body
self.userid = userid
self.setHeader("Signature", self.sessionid)
def get_keypath(self, key, userid=None, appid=None):
if userid is None:
userid = self.userid
if appid is None:
appid = self.audience
keypath = urljoin(self.root_url,"/app/%s/users/%s/keys/%s")
keypath %= (urlquote(appid, safe=""),
urlquote(userid, safe=""),
urlquote(key, safe=""))
return keypath
def get_key(self, key, userid=None, appid=None):
keypath = self.get_keypath(key, userid, appid)
res = self.get(keypath)
self.assertEquals(res.code, 200)
return json.loads(res.body)["value"]
def set_key(self, key, value, userid=None, appid=None):
keypath = self.get_keypath(key, userid, appid)
res = self.put(keypath, params={"value": value})
self.assertTrue(200 <= res.code < 300)
def del_key(self, key, value, userid=None, appid=None):
keypath = self.get_keypath(key, userid, appid)
params = {"value": "value%d" % (i,)}
res = self.delete(keypath)
self.assertTrue(200 <= res.code < 300)
def test_write_read_seq(self):
"""Test sequentual writing then reading of keys.
This test does a simple sequential write of a bunch of keys, then
reads them all back in the same order.
"""
num_keys = int(self.conf_get("test_write_read_seq", "num_keys"))
self.start_session()
# Write out a bunch of keys.
for i in range(num_keys):
self.set_key("key%d" % (i,), "value%d" % (i,))
# Read all the keys back in.
for i in range(num_keys):
value = self.get_key("key%d" % (i,))
self.assertEquals(value, "value%d" % (i,))

Просмотреть файл

@ -1,53 +0,0 @@
import unittest
import json
import random
from urllib import quote as urlquote
from urllib import unquote as urlunquote
from urlparse import urljoin
from funkload.FunkLoadTestCase import FunkLoadTestCase
from funkload.utils import Data
class SimpleTest(FunkLoadTestCase):
def setUp(self):
self.root_url = self.conf_get("main", "url")
self.num_users = int(self.conf_get("main", "num_users"))
self.num_keys = int(self.conf_get("main", "num_keys"))
def start_session(self):
assertion = "user%d@moz.com" % random.randint(0, self.num_users - 1)
audience = self.conf_get("main", "audience")
params = {"audience": audience, "assertion": assertion}
res = self.post(urljoin(self.root_url, "/session/start"),
params=params)
self.assertEquals(res.code, 200)
sessionid = res.body
self.setHeader("Signature", sessionid)
bucket_url = urljoin(self.root_url,"/app/%s/users/%s/keys/")
bucket_url %= (urlquote(audience, safe=""),
urlquote(assertion, safe=""))
return sessionid, bucket_url
def test_write_and_read_keys(self):
"""Test sequentual writing then reading of keys.
This test does a simple sequential write of a bunch of keys, then
reads them all back in the same order.
"""
sessionid, bucket_url = self.start_session()
# Write out a bunch of keys.
for i in range(self.num_keys):
key_url = urljoin(bucket_url, "key%d" % (i,))
params = {"value": "value%d" % (i,)}
res = self.put(key_url, params=params)
self.assertEquals(res.code, 200)
# Read all the keys back in.
for i in range(self.num_keys):
key_url = urljoin(bucket_url, "key%d" % (i,))
res = self.get(key_url)
self.assertEquals(res.code, 200)
self.assertEquals(json.loads(res.body)["value"], "value%d" % (i,))