Commit f84ac6f9 by Christine Lytwynec

Merge pull request #10464 from edx/clytwynec/add-paver-test-a11y

Clytwynec/add paver test a11y
parents e5fd2888 468864a3
[run]
data_file = reports/a11y/.coverage
source =
lms
cms
common/djangoapps
common/lib
openedx/core/djangoapps
omit =
lms/envs/*
cms/envs/*
common/djangoapps/terrain/*
common/djangoapps/*/migrations/*
openedx/core/djangoapps/*/migrations/*
*/test*
*/management/*
*/urls*
*/wsgi*
lms/djangoapps/*/migrations/*
cms/djangoapps/*/migrations/*
parallel = True
[report]
ignore_errors = True
include =
**/views/*.py
**/views.py
[html]
title = Bok Choy A11y Test Coverage Report
directory = reports/a11y/cover
[xml]
output = reports/a11y/coverage.xml
[run] [run]
data_file = reports/bok_choy/.coverage data_file = reports/bok_choy/.coverage
source = lms, cms, common/djangoapps, common/lib source =
omit = lms/envs/*, cms/envs/*, common/djangoapps/terrain/*, common/djangoapps/*/migrations/*, openedx/core/djangoapps/*/migrations/*, */test*, */management/*, */urls*, */wsgi*, lms/djangoapps/*/migrations/*, cms/djangoapps/*/migrations/* lms
cms
common/djangoapps
common/lib
openedx/core/djangoapps
omit =
lms/envs/*
cms/envs/*
common/djangoapps/terrain/*
common/djangoapps/*/migrations/*
openedx/core/djangoapps/*/migrations/*
*/test*
*/management/*
*/urls*
*/wsgi*
lms/djangoapps/*/migrations/*
cms/djangoapps/*/migrations/*
parallel = True parallel = True
[report] [report]
......
...@@ -456,14 +456,26 @@ To run all the bok choy accessibility tests use this command. ...@@ -456,14 +456,26 @@ To run all the bok choy accessibility tests use this command.
:: ::
paver test_bokchoy --extra_args="-a 'a11y'" paver test_a11y
To run specific tests, use the ``-t`` flag to specify a nose-style test spec To run specific tests, use the ``-t`` flag to specify a nose-style test spec
relative to the ``common/test/acceptance/tests`` directory. This is an example for it. relative to the ``common/test/acceptance/tests`` directory. This is an example for it.
:: ::
paver test_bokchoy --extra_args="-a 'a11y'" -t test_lms_dashboard.py:LmsDashboardA11yTest.test_dashboard_course_listings_a11y paver test_a11y -t test_lms_dashboard.py:LmsDashboardA11yTest.test_dashboard_course_listings_a11y
**Coverage**:
To generate the coverage report for the views run during accessibility tests::
paver a11y_coverage
Note that this coverage report is just a guideline to find areas that
are missing tests. If the view isn't 'covered', there definitely
isn't a test for it. If it is 'covered', we are loading that page
during the tests but not necessarily calling ``page.a11y_audit.check_for_accessibility_errors`` on it.
Options for Faster Development Cycles in Bok-Choy Tests Options for Faster Development Cycles in Bok-Choy Tests
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......
...@@ -16,10 +16,7 @@ except ImportError: ...@@ -16,10 +16,7 @@ except ImportError:
__test__ = False # do not collect __test__ = False # do not collect
BOKCHOY_OPTS = [
@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts([
('test_spec=', 't', 'Specific test to run'), ('test_spec=', 't', 'Specific test to run'),
('fasttest', 'a', 'Skip some setup'), ('fasttest', 'a', 'Skip some setup'),
('serversonly', 'r', 'Prepare suite and leave servers running'), ('serversonly', 'r', 'Prepare suite and leave servers running'),
...@@ -33,7 +30,32 @@ __test__ = False # do not collect ...@@ -33,7 +30,32 @@ __test__ = False # do not collect
make_option("-v", "--verbosity", action="count", dest="verbosity"), make_option("-v", "--verbosity", action="count", dest="verbosity"),
make_option("--pdb", action="store_true", help="Drop into debugger on failures or errors"), make_option("--pdb", action="store_true", help="Drop into debugger on failures or errors"),
make_option("--skip_firefox_version_validation", action='store_false', dest="validate_firefox_version") make_option("--skip_firefox_version_validation", action='store_false', dest="validate_firefox_version")
]) ]
def parse_bokchoy_opts(options):
"""
Parses bok choy options.
Returns: dict of options.
"""
return {
'test_spec': getattr(options, 'test_spec', None),
'fasttest': getattr(options, 'fasttest', False),
'num_processes': int(getattr(options, 'num_processes', 1)),
'serversonly': getattr(options, 'serversonly', False),
'testsonly': getattr(options, 'testsonly', False),
'default_store': getattr(options, 'default_store', os.environ.get('DEFAULT_STORE', 'split')),
'verbosity': getattr(options, 'verbosity', 2),
'extra_args': getattr(options, 'extra_args', ''),
'pdb': getattr(options, 'pdb', False),
'test_dir': getattr(options, 'test_dir', 'tests'),
}
@task
@needs('pavelib.prereqs.install_prereqs')
@cmdopts(BOKCHOY_OPTS)
def test_bokchoy(options): def test_bokchoy(options):
""" """
Run acceptance tests that use the bok-choy framework. Run acceptance tests that use the bok-choy framework.
...@@ -57,18 +79,33 @@ def test_bokchoy(options): ...@@ -57,18 +79,33 @@ def test_bokchoy(options):
if validate_firefox: if validate_firefox:
check_firefox_version() check_firefox_version()
opts = { opts = parse_bokchoy_opts(options)
'test_spec': getattr(options, 'test_spec', None), run_bokchoy(**opts)
'num_processes': int(getattr(options, 'num_processes', 1)),
'fasttest': getattr(options, 'fasttest', False),
'serversonly': getattr(options, 'serversonly', False), @task
'testsonly': getattr(options, 'testsonly', False), @needs('pavelib.prereqs.install_prereqs')
'default_store': getattr(options, 'default_store', os.environ.get('DEFAULT_STORE', 'split')), @cmdopts(BOKCHOY_OPTS)
'verbosity': getattr(options, 'verbosity', 2), def test_a11y(options):
'extra_args': getattr(options, 'extra_args', ''), """
'pdb': getattr(options, 'pdb', False), Run accessibility tests that use the bok-choy framework.
'test_dir': getattr(options, 'test_dir', 'tests'), 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.
`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 that are tagged
with `@attr("a11y")`.
"""
opts = parse_bokchoy_opts(options)
opts['report_dir'] = Env.BOK_CHOY_A11Y_REPORT_DIR
opts['coveragerc'] = Env.BOK_CHOY_A11Y_COVERAGERC
opts['extra_args'] = opts['extra_args'] + ' -a "a11y" '
run_bokchoy(**opts) run_bokchoy(**opts)
...@@ -113,13 +150,11 @@ def run_bokchoy(**opts): ...@@ -113,13 +150,11 @@ def run_bokchoy(**opts):
test_suite.run() test_suite.run()
@task def parse_coverage(report_dir, coveragerc):
def bokchoy_coverage():
""" """
Generate coverage reports for bok-choy tests Generate coverage reports for bok-choy or a11y tests
""" """
Env.BOK_CHOY_REPORT_DIR.makedirs_p() report_dir.makedirs_p()
coveragerc = Env.BOK_CHOY_COVERAGERC
msg = colorize('green', "Combining coverage reports") msg = colorize('green', "Combining coverage reports")
print msg print msg
...@@ -132,3 +167,29 @@ def bokchoy_coverage(): ...@@ -132,3 +167,29 @@ def bokchoy_coverage():
sh("coverage html --rcfile={}".format(coveragerc)) sh("coverage html --rcfile={}".format(coveragerc))
sh("coverage xml --rcfile={}".format(coveragerc)) sh("coverage xml --rcfile={}".format(coveragerc))
sh("coverage report --rcfile={}".format(coveragerc)) sh("coverage report --rcfile={}".format(coveragerc))
@task
def bokchoy_coverage():
"""
Generate coverage reports for bok-choy tests
"""
parse_coverage(
Env.BOK_CHOY_REPORT_DIR,
Env.BOK_CHOY_COVERAGERC
)
@task
def a11y_coverage():
"""
Generate coverage reports for a11y tests. Note that this coverage report
is just a guideline to find areas that are missing tests. If the view
isn't 'covered', there definitely isn't a test for it. If it is
'covered', we are loading that page during the tests but not necessarily
calling ``page.a11y_audit.check_for_accessibility_errors`` on it.
"""
parse_coverage(
Env.BOK_CHOY_A11Y_REPORT_DIR,
Env.BOK_CHOY_A11Y_COVERAGERC
)
...@@ -29,7 +29,9 @@ class Env(object): ...@@ -29,7 +29,9 @@ class Env(object):
BOK_CHOY_DIR = REPO_ROOT / "common" / "test" / "acceptance" BOK_CHOY_DIR = REPO_ROOT / "common" / "test" / "acceptance"
BOK_CHOY_LOG_DIR = REPO_ROOT / "test_root" / "log" BOK_CHOY_LOG_DIR = REPO_ROOT / "test_root" / "log"
BOK_CHOY_REPORT_DIR = REPORT_DIR / "bok_choy" BOK_CHOY_REPORT_DIR = REPORT_DIR / "bok_choy"
BOK_CHOY_A11Y_REPORT_DIR = REPORT_DIR / "a11y"
BOK_CHOY_COVERAGERC = BOK_CHOY_DIR / ".coveragerc" BOK_CHOY_COVERAGERC = BOK_CHOY_DIR / ".coveragerc"
BOK_CHOY_A11Y_COVERAGERC = BOK_CHOY_DIR / ".a11ycoveragerc"
# If set, put reports for run in "unique" directories. # If set, put reports for run in "unique" directories.
# The main purpose of this is to ensure that the reports can be 'slurped' # The main purpose of this is to ensure that the reports can be 'slurped'
......
...@@ -18,10 +18,11 @@ except ImportError: ...@@ -18,10 +18,11 @@ except ImportError:
__test__ = False # do not collect __test__ = False # do not collect
def start_servers(default_store): def start_servers(default_store, coveragerc=None):
""" """
Start the servers we will run tests on, returns PIDs for servers. Start the servers we will run tests on, returns PIDs for servers.
""" """
coveragerc = coveragerc or Env.BOK_CHOY_COVERAGERC
def start_server(cmd, logfile, cwd=None): def start_server(cmd, logfile, cwd=None):
""" """
...@@ -38,7 +39,7 @@ def start_servers(default_store): ...@@ -38,7 +39,7 @@ def start_servers(default_store):
"manage {service} --settings bok_choy runserver " "manage {service} --settings bok_choy runserver "
"{address} --traceback --noreload".format( "{address} --traceback --noreload".format(
default_store=default_store, default_store=default_store,
coveragerc=Env.BOK_CHOY_COVERAGERC, coveragerc=coveragerc,
service=service, service=service,
address=address, address=address,
) )
......
...@@ -43,7 +43,7 @@ class BokChoyTestSuite(TestSuite): ...@@ -43,7 +43,7 @@ class BokChoyTestSuite(TestSuite):
super(BokChoyTestSuite, self).__init__(*args, **kwargs) super(BokChoyTestSuite, self).__init__(*args, **kwargs)
self.test_dir = Env.BOK_CHOY_DIR / kwargs.get('test_dir', 'tests') self.test_dir = Env.BOK_CHOY_DIR / kwargs.get('test_dir', 'tests')
self.log_dir = Env.BOK_CHOY_LOG_DIR self.log_dir = Env.BOK_CHOY_LOG_DIR
self.report_dir = Env.BOK_CHOY_REPORT_DIR self.report_dir = kwargs.get('report_dir', Env.BOK_CHOY_REPORT_DIR)
self.xunit_report = self.report_dir / "xunit.xml" self.xunit_report = self.report_dir / "xunit.xml"
self.cache = Env.BOK_CHOY_CACHE self.cache = Env.BOK_CHOY_CACHE
self.fasttest = kwargs.get('fasttest', False) self.fasttest = kwargs.get('fasttest', False)
...@@ -56,6 +56,7 @@ class BokChoyTestSuite(TestSuite): ...@@ -56,6 +56,7 @@ class BokChoyTestSuite(TestSuite):
self.extra_args = kwargs.get('extra_args', '') self.extra_args = kwargs.get('extra_args', '')
self.har_dir = self.log_dir / 'hars' self.har_dir = self.log_dir / 'hars'
self.imports_dir = kwargs.get('imports_dir', None) self.imports_dir = kwargs.get('imports_dir', None)
self.coveragerc = kwargs.get('coveragerc', None)
def __enter__(self): def __enter__(self):
super(BokChoyTestSuite, self).__enter__() super(BokChoyTestSuite, self).__enter__()
...@@ -165,7 +166,7 @@ class BokChoyTestSuite(TestSuite): ...@@ -165,7 +166,7 @@ class BokChoyTestSuite(TestSuite):
# Ensure the test servers are available # Ensure the test servers are available
msg = colorize('green', "Confirming servers are running...") msg = colorize('green', "Confirming servers are running...")
print msg print msg
bokchoy_utils.start_servers(self.default_store) bokchoy_utils.start_servers(self.default_store, self.coveragerc)
def run_servers_continuously(self): def run_servers_continuously(self):
""" """
......
...@@ -3,4 +3,7 @@ echo "Setting up for accessibility tests..." ...@@ -3,4 +3,7 @@ echo "Setting up for accessibility tests..."
source scripts/jenkins-common.sh source scripts/jenkins-common.sh
echo "Running explicit accessibility tests..." echo "Running explicit accessibility tests..."
SELENIUM_BROWSER=phantomjs paver test_bokchoy --extra_args="-a 'a11y'" SELENIUM_BROWSER=phantomjs paver test_a11y
echo "Generating coverage report..."
paver a11y_coverage
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment