Commit 4cbba8e7 authored by Devon Kearns's avatar Devon Kearns

Imported Upstream version 1.13.0

parents
We provide buildouts for funkload in two flavours: default and minimal.
The default ``buildout.cfg`` also installs TCPWatch, which is needed to *record* tests.
The ``minimial.cfg`` installs funkload only, without any dependencies. It is useful for
installations where you only want to *run* the tests.
If you also want to generate reports (i.e. use ``fl-build-report``) you need to install
gnuplot. See the `installation instructions<http://funkload.nuxeo.org/INSTALL.html#id3>`_
for details. gnuplot has quite a few platform specific dependencies and is thus outside the
scope of a buildout.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
# FunkLoad Makefile
# $Id: $
#
.PHONY: build pkg sdist egg install clean rpm
TARGET := bertha_:~/public_public_html/funkload
# use TAG=a for alpha, b for beta, rc for release candidate
ifdef TAG
PKGTAG := egg_info --tag-build=$(TAG) --tag-svn-revision
else
PKGTAG :=
endif
build:
python setup.py $(PKGTAG) build
test:
cd src/funkload/tests && fl-run-test -v test_Install.py
pkg: sdist egg
sdist:
python setup.py $(PKGTAG) sdist
egg:
-python2.4 setup.py $(PKGTAG) bdist_egg
-python2.5 setup.py $(PKGTAG) bdist_egg
-python2.6 setup.py $(PKGTAG) bdist_egg
distrib:
-scp dist/funkload-*.tar.gz $(TARGET)/snapshots
-scp dist/funkload-*.egg $(TARGET)/snapshots
install:
python setup.py $(PKGTAG) install
register:
-python2.4 setup.py register sdist bdist_egg upload
-python2.5 setup.py register bdist_egg upload
-python2.6 setup.py register bdist_egg upload
uninstall:
-easy_install -m funkload
-rm -rf /usr/lib/python2.3/site-packages/funkload*
-rm -rf /usr/lib/python2.4/site-packages/funkload*
-rm -rf /usr/lib/python2.5/site-packages/funkload*
-rm -rf /usr/lib/python2.6/dist-packages/funkload*
-rm -rf /usr/local/lib/python2.6/dist-packages/funkload*
-rm -rf /usr/local/funkload/
-rm -f /usr/local/bin/fl-*
-rm -f /usr/bin/fl-*
clean:
find . "(" -name "*~" -or -name ".#*" -or -name "#*#" -or -name "*.pyc" ")" -print0 | xargs -0 rm -f
rm -rf ./build ./dist ./MANIFEST ./funkload.egg-info
Metadata-Version: 1.0
Name: funkload
Version: 1.13.0
Summary: Functional and load web tester.
Home-page: http://funkload.nuxeo.org/
Author: Benoit Delbosc
Author-email: bdelbosc@nuxeo.com
License: GPL
Download-URL: http://funkload.nuxeo.org/funkload-1.13.0.tar.gz
Description: FunkLoad is a functional and load web tester, written in Python, whose
main use cases are:
* Functional testing of web projects, and thus regression testing as well.
* Performance testing: by loading the web application and monitoring
your servers it helps you to pinpoint bottlenecks, giving a detailed
report of performance measurement.
* Load testing tool to expose bugs that do not surface in cursory testing,
like volume testing or longevity testing.
* Stress testing tool to overwhelm the web application resources and test
the application recoverability.
* Writing web agents by scripting any web repetitive task, like checking if
a site is alive.
Main FunkLoad features are:
* FunkLoad is free software distributed under the `GNU GPL`_.
* Functional test are pure Python scripts using the pyUnit framework like
normal unit test. Python enable complex scenarios to handle real world
applications.
* Truly emulates a web browser (single-threaded) using Richard Jones'
webunit_:
- basic authentication support
- cookies support
- referrer support
- fetching css, javascript and images
- emulating a browser cache
- file upload and multipart/form-data submission
- post any kind of content type like ``application/xml``
- https support
- http_proxy support
* Advanced test runner with many command-line options:
- set the target server url
- display the fetched page in real time in your browser
- debug mode
- check performance of a single page (or set of pages) inside a test
- green/red color mode
- select or exclude tests cases using a regex
- support normal pyUnit test
- support doctest from a plain text file or embedded in python docstring
* Turn a functional test into a load test: just by invoking the bench runner
you can identify scalability and performance problems.
* Detailed bench reports in ReST or HTML (and PDF via ps2pdf)
containing:
- the bench configuration
- tests, pages, requests stats and charts.
- the 5 slowest requests.
- monitoring one or many servers cpu usage, load average, memory/swap
usage and network traffic charts.
- an http error summary list
View a `report example <http://funkload.nuxeo.org/report-example/test_seam_java6/>`.
* Differential reports to compare 2 bench reports giving a quick overview of
scalability and velocity changes.
View a `diff report example <http://funkload.nuxeo.org/report-example/diff_seam_java_6_vs_5/>`.
* Easy test customization using a configuration file or command line options.
* Easy test creation using embeded TCPWatch as proxy recorder, so you can
use your web browser and produce a FunkLoad test automatically, including
file upload or any ajax call.
* Provides web assertion helpers to check expected results in responses.
* Provides helpers to retrieve contents in responses page using DOM.
* Provides a funkload.CPSTestCase to ease Zope and Nuxeo CPS testing.
* Easy to install (EasyInstall_) and use, see examples in the demo folder.
* Works fine with CPS or any Zope application, CherryPy, Nuxeo EP or any
JBoss Seam JSF MyFaces applications ...
Keywords: testing benching load performance functional monitoring
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Natural Language :: English
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
Classifier: Topic :: Software Development :: Testing
Classifier: Topic :: Software Development :: Quality Assurance
Classifier: Topic :: System :: Benchmark
Classifier: Topic :: System :: Monitoring
This diff is collapsed.
======
THANKS
======
Mirko Friedenhagen: Providing reports percentiles features.
Ivan Kurmanov: Webunit mimeEncode patch using CRLF.
Greg 912: http_proxy support.
Bryan Helmkamp: Webunit mimeEncode patch extra CRLF on first boundary, adding
Content-Type header for file upload.
Lin: Patch to remove cookie with 'deleted' value.
Sylvain Hellegouarch: Python 2.5 support.
M.-A. Darche: Extensive use, documentation improvements and FunkLoad name
co-idea.
Jehiah Czebotar: Mutiple redirects patch.
Dan Rahmel: Recorder patch.
Daniel Swärd: Feedback on post method and cookie patch.
Ross Patterson: Support of setuptools console_scripts.
Tom Lazar: Support of buildout, label option for the bench runner, many fixes.
Toni Mueller: Debian package maintener.
Jose Parrella: Debian man page writter.
David Fraser: Patch on Recorder to support non standard tcpwatch installation.
Kelvin Ward: Patch on Report builder to support win gnuplot.
Goutham Bath: HTTP debug server for the bench runner.
Arshavski Alexander, Ethan Winn: Bug report and patch for OS X.
Gareth Davidson: Cookies patch, improve win support.
Martin Aspeli: Patch on recorder/report generation.
=============
FunkLoad Todo
=============
See the trac tickets: http://svn.nuxeo.org/trac/pub/report/12
.. Local Variables:
.. mode: rst
.. End:
.. vim: set filetype=rst:
##############################################################################
#
# Copyright (c) 2006 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Bootstrap a buildout-based project
Simply run this script in a directory containing a buildout.cfg.
The script accepts buildout command-line options, so you can
use the -c option to specify an alternate configuration file.
$Id$
"""
import os, shutil, sys, tempfile, urllib2
tmpeggs = tempfile.mkdtemp()
try:
import pkg_resources
except ImportError:
ez = {}
exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
).read() in ez
ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
import pkg_resources
cmd = 'from setuptools.command.easy_install import main; main()'
if sys.platform == 'win32':
cmd = '"%s"' % cmd # work around spawn lamosity on windows
ws = pkg_resources.working_set
assert os.spawnle(
os.P_WAIT, sys.executable, sys.executable,
'-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout',
dict(os.environ,
PYTHONPATH=
ws.find(pkg_resources.Requirement.parse('setuptools')).location
),
) == 0
ws.add_entry(tmpeggs)
ws.require('zc.buildout')
import zc.buildout.buildout
zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
shutil.rmtree(tmpeggs)
[buildout]
extends = minimal.cfg
parts +=
tcpwatch-source
tcpwatch-install
[tcpwatch-source]
recipe = hexagonit.recipe.download
url = http://hathawaymix.org/Software/TCPWatch/tcpwatch-1.3.tar.gz
[tcpwatch-install]
recipe = z3c.recipe.egg:setup
setup = ${tcpwatch-source:location}/tcpwatch
args = install_scripts --install-dir=${tcpwatch-source:location}/bin
[funkload]
recipe = zc.recipe.egg:scripts
eggs =
docutils
funkload
initialization =
import os
os.environ['PATH'] = (
'${tcpwatch-source:location}/bin:'+os.environ['PATH'])
# FunkLoad doc Makefile
# $Id: $
# to build api documentation you need python docutils and epydoc
#
.PHONY: all epydoc clean distrib
TARGET := bertha_:~/public_public_html/funkload
HTML_DOCS := README.html INSTALL.html CHANGES.html
CSS_FILE := ../src/funkload/data/funkload.css
RST2HTML := rst2html -t --stylesheet-path=$(CSS_FILE) --embed-stylesheet
all: doc epydoc
doc: ${HTML_DOCS}
%.html: ../%.txt $(CSS_FILE)
${RST2HTML} $< $@
epydoc:
epydoc --name FunkLoad -u ../../ --html --output ./api/ ../src/funkload/
distrib: doc
scp -r ${HTML_DOCS} api $(TARGET)/
clean:
-rm -rf ./api/* $(HTML_DOCS)
-@find . "(" -name "*~" -or -name ".#*" -or -name "#*#" -or -name "*.pyc" ")" -print0 | xargs -0 rm -f
#!python
"""Bootstrap setuptools installation
If you want to use setuptools in your package's setup.py, just include this
file in the same directory with it, and add this to the top of your setup.py::
from ez_setup import use_setuptools
use_setuptools()
If you want to require a specific version of setuptools, set a download
mirror, or use an alternate download directory, you can do so by supplying
the appropriate options to ``use_setuptools()``.
This file can also be run as a script to install or upgrade setuptools.
"""
import sys
DEFAULT_VERSION = "0.6c8"
DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
md5_data = {
'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
}
import sys, os
def _validate_md5(egg_name, data):
if egg_name in md5_data:
from md5 import md5
digest = md5(data).hexdigest()
if digest != md5_data[egg_name]:
print >>sys.stderr, (
"md5 validation of %s failed! (Possible download problem?)"
% egg_name
)
sys.exit(2)
return data
def use_setuptools(
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
download_delay=15
):
"""Automatically find/download setuptools and make it available on sys.path
`version` should be a valid setuptools version number that is available
as an egg for download under the `download_base` URL (which should end with
a '/'). `to_dir` is the directory where setuptools will be downloaded, if
it is not already available. If `download_delay` is specified, it should
be the number of seconds that will be paused before initiating a download,
should one be required. If an older version of setuptools is installed,
this routine will print a message to ``sys.stderr`` and raise SystemExit in
an attempt to abort the calling script.
"""
was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
def do_download():
egg = download_setuptools(version, download_base, to_dir, download_delay)
sys.path.insert(0, egg)
import setuptools; setuptools.bootstrap_install_from = egg
try:
import pkg_resources
except ImportError:
return do_download()
try:
pkg_resources.require("setuptools>="+version); return
except pkg_resources.VersionConflict, e:
if was_imported:
print >>sys.stderr, (
"The required version of setuptools (>=%s) is not available, and\n"
"can't be installed while this script is running. Please install\n"
" a more recent version first, using 'easy_install -U setuptools'."
"\n\n(Currently using %r)"
) % (version, e.args[0])
sys.exit(2)
else:
del pkg_resources, sys.modules['pkg_resources'] # reload ok
return do_download()
except pkg_resources.DistributionNotFound:
return do_download()
def download_setuptools(
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
delay = 15
):
"""Download setuptools from a specified location and return its filename
`version` should be a valid setuptools version number that is available
as an egg for download under the `download_base` URL (which should end
with a '/'). `to_dir` is the directory where the egg will be downloaded.
`delay` is the number of seconds to pause before an actual download attempt.
"""
import urllib2, shutil
egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
url = download_base + egg_name
saveto = os.path.join(to_dir, egg_name)
src = dst = None
if not os.path.exists(saveto): # Avoid repeated downloads
try:
from distutils import log
if delay:
log.warn("""
---------------------------------------------------------------------------
This script requires setuptools version %s to run (even to display
help). I will attempt to download it for you (from
%s), but
you may need to enable firewall access for this script first.
I will start the download in %d seconds.
(Note: if this machine does not have network access, please obtain the file
%s
and place it in this directory before rerunning this script.)
---------------------------------------------------------------------------""",
version, download_base, delay, url
); from time import sleep; sleep(delay)
log.warn("Downloading %s", url)
src = urllib2.urlopen(url)
# Read/write all in one block, so we don't create a corrupt file
# if the download is interrupted.
data = _validate_md5(egg_name, src.read())
dst = open(saveto,"wb"); dst.write(data)
finally:
if src: src.close()
if dst: dst.close()
return os.path.realpath(saveto)
def main(argv, version=DEFAULT_VERSION):
"""Install or upgrade setuptools and EasyInstall"""
try:
import setuptools
except ImportError:
egg = None
try:
egg = download_setuptools(version, delay=0)
sys.path.insert(0,egg)
from setuptools.command.easy_install import main
return main(list(argv)+[egg]) # we're done here
finally:
if egg and os.path.exists(egg):
os.unlink(egg)
else:
if setuptools.__version__ == '0.0.1':
print >>sys.stderr, (
"You have an obsolete version of setuptools installed. Please\n"
"remove it from your system entirely before rerunning this script."
)
sys.exit(2)
req = "setuptools>="+version
import pkg_resources
try:
pkg_resources.require(req)
except pkg_resources.VersionConflict:
try:
from setuptools.command.easy_install import main
except ImportError:
from easy_install import main
main(list(argv)+[download_setuptools(delay=0)])
sys.exit(0) # try to force an exit
else:
if argv:
from setuptools.command.easy_install import main
main(argv)
else:
print "Setuptools version",version,"or greater has been installed."
print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
def update_md5(filenames):
"""Update our built-in md5 registry"""
import re
from md5 import md5
for name in filenames:
base = os.path.basename(name)
f = open(name,'rb')
md5_data[base] = md5(f.read()).hexdigest()
f.close()
data = [" %r: %r,\n" % it for it in md5_data.items()]
data.sort()
repl = "".join(data)
import inspect
srcfile = inspect.getsourcefile(sys.modules[__name__])
f = open(srcfile, 'rb'); src = f.read(); f.close()
match = re.search("\nmd5_data = {\n([^}]+)}", src)
if not match:
print >>sys.stderr, "Internal error!"
sys.exit(2)
src = src[:match.start(1)] + repl + src[match.end(1):]
f = open(srcfile,'w')
f.write(src)
f.close()
if __name__=='__main__':
if len(sys.argv)>2 and sys.argv[1]=='--md5update':
update_md5(sys.argv[2:])
else:
main(sys.argv[1:])
[buildout]
parts =
funkload
test
packages
eggs =
funkload
develop = .
[funkload]
recipe = zc.recipe.egg:scripts
eggs =
docutils
funkload
[test]
recipe = zc.recipe.testrunner
eggs = ${buildout:eggs}
[packages]
recipe = collective.recipe.omelette
eggs = ${buildout:eggs}
#!/usr/bin/python
# (C) Copyright 2005 Nuxeo SAS <http://nuxeo.com>
# Author: bdelbosc@nuxeo.com
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
"""Convert a testmaker script into a FunkLoad test.
$Id: ftest_utils.py 22915 2005-06-09 15:38:07Z bdelbosc $
"""
from funkload.ReportBuilder import main
main()
#!/usr/bin/python
# (C) Copyright 2005 Nuxeo SAS <http://nuxeo.com>
# Author: bdelbosc@nuxeo.com
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
"""Simple client that control the credential server."""
import sys
from funkload.CredentialFile import CredentialFileController
def main():
"""Control credentiald server."""
ctl = CredentialFileController()
sys.exit(ctl())
if __name__ == '__main__':
main()
#!/usr/bin/python
# (C) Copyright 2005 Nuxeo SAS <http://nuxeo.com>
# Author: bdelbosc@nuxeo.com
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
#
"""Extract the demo from the funkload egg into the current path."""
from funkload.DemoInstaller import main
main()