9 | | == Doc Tests == |
10 | | Agile documentation which can be run using Web2Py's Admin UI. |
11 | | * e.g. http://127.0.0.1:8000/admin/default/test/sahana/default.py |
12 | | We have a module which uses [http://code.google.com/p/wsgi-intercept wsgi_intercept] & [http://cherrypy.org CherryPy]'s [http://cherrypy.org/browser/trunk/cherrypy/test/webtest.py WebTest]: {{{modules/s3_test.py}}} |
| 9 | == Functional Tests == |
| 10 | Building the Right Code |
| 11 | |
| 12 | We have integrated [http://seleniumhq.org/projects/core Selenium Core] into {{{/static/selenium}}} so that Functional Tests can be run (via 'Test' menu option visible to Admins). |
| 13 | |
| 14 | Additional functions (e.g. Random) are added to: |
| 15 | {{{ |
| 16 | /static/selenium/core/scripts/user-extensions.js |
| 17 | }}} |
| 18 | |
| 19 | !ToDo: create a HandleResults.py for storing results (to make visible to CI): |
| 20 | * e.g. Convert this one from PHP: http://wiki.openqa.org/display/SEL/Integrating+Selenium+And+CruiseControl.Net |
| 21 | * e.g. Extract from [http://jrandolph.com/selenium-plone/selenium-0.3rc2-plone.zip PloneTool]'s {{{FunctionalTestTool.py}}} |
| 22 | |
| 23 | Tests can be developed using [http://seleniumhq.org/projects/ide Selenium IDE], if desired. |
| 24 | |
| 25 | If desired they can be maintained in a Python format using [http://joker.linuxstuff.pl/documentation/make_selenium make_selenium.py]. HTML tests run by !TestRunner are in {{{/static/selenium/tests}}}. Python format tests are in {{{/static/selenium/src}}}. Convert between these using: |
| 26 | {{{ |
| 27 | python make_selenium.py src tests |
| 28 | python make_selenium.py -p tests src |
| 29 | }}} |
| 30 | |
17 | | [http://seleniumhq.org/projects/remote-control Selenium RC] |
| 35 | [http://seleniumhq.org/projects/remote-control Selenium RC] is great due to ability to handle !JavaScript & also due to having an [http://seleniumhq.org/projects/ide IDE] for generating them (export as Python).[[BR]] |
| 36 | The IDE output needs to be [http://groups.google.com/group/web2py/msg/d8c9fd6008029f6b modified] to work with Web2Py.[[BR]] |
| 37 | NB Custom functions (e.g. for Random) cannot be shared with the Functional Tests (custom=JS) but the rest of the tests can be.[[BR]] |
| 38 | These tests are stored in {{{/tests}}}.[[BR]] |
| 39 | !ToDo: Port the storeRandom function from JS to Python: |
| 40 | {{{ |
| 41 | import random |
| 42 | print "test_%i@xxxxxxxx" % random.randint(1, 10000) |
| 43 | }}} |
| 44 | |
| 45 | [http://cherrypy.org CherryPy]'s [http://cherrypy.org/browser/trunk/cherrypy/test/webtest.py WebTest] is good for in-process testing.[[BR]] |
| 46 | These tests are stored in {{{/tests/webtest}}}.[[BR]] |
| 47 | NB These are a work-in-progress...need to enable access to Web2Py environment (db, etc) using: |
| 48 | {{{ |
| 49 | from gluon.shell import exec_environment |
| 50 | env=exec_environment('the_model_file.py') |
| 51 | }}} |
| 52 | Or could write as a 'Controller' & call from CLI: |
| 53 | {{{ |
| 54 | python web2py.py -S appname -M -R yourscript.py |
| 55 | }}} |
| 56 | |
| 57 | == Doc Tests == |
| 58 | Agile documentation which can be run using Web2Py's Admin UI. |
| 59 | * e.g. http://127.0.0.1:8000/admin/default/test/sahana/default.py |
| 60 | We have a module which uses [http://code.google.com/p/wsgi-intercept wsgi_intercept] & [http://cherrypy.org CherryPy]'s [http://cherrypy.org/browser/trunk/cherrypy/test/webtest.py WebTest]: {{{modules/s3_test.py}}} [[BR]] |
| 61 | This can be used from Controllers like: |
| 62 | {{{ |
| 63 | def login(): |
| 64 | """ Login |
| 65 | >>> from applications.sahana.modules.s3_test import WSGI_Test |
| 66 | >>> test=WSGI_Test(db) |
| 67 | >>> '200 OK' in test.getPage('/sahana/%s/login' % module) |
| 68 | True |
| 69 | >>> test.assertHeader("Content-Type", "text/html") |
| 70 | >>> test.assertInBody('Login') |
| 71 | """ |
| 72 | }}} |
| 73 | This works fine,although if an assert fails then the UI gets stuck :/ [[BR]] |
| 74 | The 'db' access part isn't yet working. |
| 75 | |
| 76 | Note that Web2Py uses a big doctest at the end of each file: {{{def test_all()}}} |
20 | | We use the Trac-integrated Bitten to monitor code quality. |
21 | | |
22 | | == Functional Tests == |
23 | | We have integrated [http://seleniumhq.org/projects/core Selenium Core] into /static/selenium so that Functional Tests can be run. |
24 | | Tests can be developed using [http://seleniumhq.org/projects/ide Selenium IDE], if desired. |
25 | | If desired they can be maintained in a Python format using |
26 | | |
| 79 | We are starting to use the Trac-integrated [http://bitten.edgewall.org Bitten] to monitor code quality. |
| 80 | {{{ |
| 81 | <step id="lint" description="Run PyLint"> |
| 82 | <python:exec module="pylint.lint" output="pylint-report.txt" args="/var/www/trac/sahana3/bzr"/> |
| 83 | <python:pylint file="pylint-report.txt" /> |
| 84 | </step> |
| 85 | }}} |
| 86 | ImportError: Unable to find module for /var/www/trac/sahana3/bzr/modules/validators.py in /tmp/bittenA787wC/build_Trunk_1, |
| 87 | {{{ |
| 88 | <step id="build" description="Compile to byte code"> |
| 89 | <python:distutils command="build"/> |
| 90 | </step> |
| 91 | }}} |
| 92 | distutils failed (512)[[BR]] |
| 93 | /usr/bin/python: can't open file '/tmp/bittenk8YjFn/build_Trunk_1/setup.py': [Errno 2] No such file or directory |
| 94 | {{{ |
| 95 | <step id="test" description="Run unit tests"> |
| 96 | <python:distutils command="unittest"/> |
| 97 | <python:unittest file="build/test-results.xml"/> |
| 98 | <python:trace summary="build/test-coverage.txt" coverdir="build/coverage" include="trac*" exclude="*.tests.*"/> |
| 99 | </step> |
| 100 | }}} |
| 101 | !ToDo: Configure a Bitten task to run: http://localhost/Selenium/TestRunner.html?auto=true |