| 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 |