bok_choy.py 4.85 KB
Newer Older
1 2 3 4 5 6 7
"""
Run acceptance tests that use the bok-choy framework
http://bok-choy.readthedocs.org/en/latest/
"""
from paver.easy import task, needs, cmdopts, sh
from pavelib.utils.test.suites.bokchoy_suite import BokChoyTestSuite
from pavelib.utils.envs import Env
Minh Tue Vo committed
8
from pavelib.utils.test.utils import check_firefox_version
9
from optparse import make_option
10
import os
11 12 13 14 15 16 17 18 19 20 21 22 23 24

try:
    from pygments.console import colorize
except ImportError:
    colorize = lambda color, text: text  # pylint: disable-msg=invalid-name

__test__ = False  # do not collect


@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
    ('test_spec=', 't', 'Specific test to run'),
    ('fasttest', 'a', 'Skip some setup'),
25 26
    ('serversonly', 'r', 'Prepare suite and leave servers running'),
    ('testsonly', 'o', 'Assume servers are running and execute tests only'),
27
    ('extra_args=', 'e', 'adds as extra args to the test command'),
28
    ('default_store=', 's', 'Default modulestore'),
29
    ('test_dir=', 'd', 'Directory for finding tests (relative to common/test/acceptance)'),
30 31 32
    make_option("--verbose", action="store_const", const=2, dest="verbosity"),
    make_option("-q", "--quiet", action="store_const", const=0, dest="verbosity"),
    make_option("-v", "--verbosity", action="count", dest="verbosity"),
33
    make_option("--pdb", action="store_true", help="Drop into debugger on failures or errors"),
Minh Tue Vo committed
34
    make_option("--skip_firefox_version_validation", action='store_false', dest="validate_firefox_version")
35 36 37 38
])
def test_bokchoy(options):
    """
    Run acceptance tests that use the bok-choy framework.
39 40 41 42
    Skips some static asset steps if `fasttest` is True.
    Using 'serversonly' will prepare and run servers, leaving a process running in the terminal. At
        the same time, a user can open a separate terminal and use 'testsonly' for executing tests against
        those running servers.
43 44 45 46 47 48 49 50

    `test_spec` is a nose-style test specifier relative to the test directory
    Examples:
    - path/to/test.py
    - path/to/test.py:TestFoo
    - path/to/test.py:TestFoo.test_bar
    It can also be left blank to run all tests in the suite.
    """
51 52 53 54 55 56
    # Note: Bok Choy uses firefox if SELENIUM_BROWSER is not set. So we are using
    # firefox as the default here.
    using_firefox = (os.environ.get('SELENIUM_BROWSER', 'firefox') == 'firefox')
    validate_firefox = getattr(options, 'validate_firefox_version', using_firefox)

    if validate_firefox:
Minh Tue Vo committed
57
        check_firefox_version()
58

59 60 61
    opts = {
        'test_spec': getattr(options, 'test_spec', None),
        'fasttest': getattr(options, 'fasttest', False),
62 63
        'serversonly': getattr(options, 'serversonly', False),
        'testsonly': getattr(options, 'testsonly', False),
64
        'default_store': getattr(options, 'default_store', 'split'),
65 66
        'verbosity': getattr(options, 'verbosity', 2),
        'extra_args': getattr(options, 'extra_args', ''),
67
        'pdb': getattr(options, 'pdb', False),
68
        'test_dir': getattr(options, 'test_dir', 'tests'),
69
    }
70
    run_bokchoy(**opts)
71 72 73 74 75 76 77 78


@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
    ('test_spec=', 't', 'Specific test to run'),
    ('fasttest', 'a', 'Skip some setup'),
    ('imports_dir=', 'd', 'Directory containing (un-archived) courses to be imported'),
79
    ('default_store=', 's', 'Default modulestore'),
80 81 82 83 84 85 86 87 88 89 90
    make_option("--verbose", action="store_const", const=2, dest="verbosity"),
    make_option("-q", "--quiet", action="store_const", const=0, dest="verbosity"),
    make_option("-v", "--verbosity", action="count", dest="verbosity"),
])
def perf_report_bokchoy(options):
    """
    Generates a har file for with page performance info.
    """
    opts = {
        'test_spec': getattr(options, 'test_spec', None),
        'fasttest': getattr(options, 'fasttest', False),
91
        'default_store': getattr(options, 'default_store', 'split'),
92 93 94
        'imports_dir': getattr(options, 'imports_dir', None),
        'verbosity': getattr(options, 'verbosity', 2),
        'test_dir': 'performance',
95
    }
96 97 98 99 100 101 102
    run_bokchoy(**opts)


def run_bokchoy(**opts):
    """
    Runs BokChoyTestSuite with the given options.
    """
103 104 105 106
    test_suite = BokChoyTestSuite('bok-choy', **opts)
    msg = colorize(
        'green',
        'Running tests using {default_store} modulestore.'.format(
107
            default_store=test_suite.default_store,
108
        )
109
    )
110 111
    print(msg)
    test_suite.run()
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132


@task
def bokchoy_coverage():
    """
    Generate coverage reports for bok-choy tests
    """
    Env.BOK_CHOY_REPORT_DIR.makedirs_p()
    coveragerc = Env.BOK_CHOY_COVERAGERC

    msg = colorize('green', "Combining coverage reports")
    print(msg)

    sh("coverage combine --rcfile={}".format(coveragerc))

    msg = colorize('green', "Generating coverage reports")
    print(msg)

    sh("coverage html --rcfile={}".format(coveragerc))
    sh("coverage xml --rcfile={}".format(coveragerc))
    sh("coverage report --rcfile={}".format(coveragerc))