From 856731fd48e97db23d5a8f21f1bd4a3380ab681b Mon Sep 17 00:00:00 2001 From: Awais Qureshi Date: Thu, 24 Mar 2022 18:26:43 +0500 Subject: [PATCH] docs: Removing bokchoy and a11y reference from documentation. (#30105) * docs: Removing bokchoy and a11y reference from documentation. --- docs/guides/testing/test_pyramid.png | Bin 17582 -> 19816 bytes docs/guides/testing/testing.rst | 253 +-------------------------- 2 files changed, 5 insertions(+), 248 deletions(-) diff --git a/docs/guides/testing/test_pyramid.png b/docs/guides/testing/test_pyramid.png index f5d359bcfd6a8ab14025a3ab1c05bd8a3cd6738b..6100353fb4ca98100f9384de422b536100e7a2f2 100644 GIT binary patch literal 19816 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 L@^or+peO$iYT=&6 literal 17582 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 diff --git a/docs/guides/testing/testing.rst b/docs/guides/testing/testing.rst index a2c62cf45c..9baf24aee7 100644 --- a/docs/guides/testing/testing.rst +++ b/docs/guides/testing/testing.rst @@ -9,8 +9,7 @@ Testing Overview ======== -We maintain three kinds of tests: unit tests, integration tests, and -acceptance tests. +We maintain two kinds of tests: unit tests and integration tests. Overall, you want to write the tests that **maximize coverage** while **minimizing maintenance**. In practice, this usually means investing @@ -22,8 +21,8 @@ the code base. Test Pyramid -The pyramid above shows the relative number of unit tests, integration -tests, and acceptance tests. Most of our tests are unit tests or +The pyramid above shows the relative number of unit tests and integration +tests. Most of our tests are unit tests or integration tests. Test Types @@ -67,19 +66,6 @@ Integration Tests .. _Django test client: https://docs.djangoproject.com/en/dev/topics/testing/overview/ - -UI Acceptance Tests -~~~~~~~~~~~~~~~~~~~ - -- There should be very few UI acceptance tests since they are generally slow and - flaky. Use these to test only bare minimum happy paths for necessary features. - -- We use `Bok Choy`_ to write end-user acceptance tests directly in Python, - using the framework to maximize reliability and maintainability. - -.. _Bok Choy: https://bok-choy.readthedocs.org/en/latest/tutorial.html - - Test Locations -------------- @@ -94,14 +80,6 @@ Test Locations the test for ``src/views/module.js`` should be written in ``spec/views/module_spec.js``. -- UI acceptance tests: - - - Set up and helper methods, and stubs for external services: - ``common/djangoapps/terrain`` - - Bok Choy Acceptance Tests: located under ``common/test/acceptance/tests`` - - Bok Choy Accessibility Tests: located under ``common/test/acceptance/tests`` and tagged with ``@attr("a11y")`` - - Bok Choy PageObjects: located under ``common/test/acceptance/pages`` - Running Tests ============= @@ -109,8 +87,7 @@ You can run all of the unit-level tests using this command:: paver test -This includes python, JavaScript, and documentation tests. It does not, -however, run any acceptance tests. +This includes python, JavaScript, and documentation tests. Note - `paver` is a scripting tool. To get information about various options, you can run the this command:: @@ -310,226 +287,6 @@ Note: the port is also output to the console that you ran the tests from if you These paver commands call through to Karma. For more info, see `karma-runner.github.io `__. -Running Bok Choy Acceptance Tests ---------------------------------- - -We use `Bok Choy`_ for acceptance testing. Bok Choy is a UI-level acceptance -test framework for writing robust `Selenium`_ tests in `Python`_. Bok Choy -makes your acceptance tests reliable and maintainable by utilizing the Page -Object and Promise design patterns. - -**Prerequisites**: - -These prerequisites are all automatically installed and available in -`Devstack`_, the supported development enviornment for the Open edX platform. - -* Chromedriver and Chrome - -* Mongo - -* Memcache - -* mySQL - -To run all the bok choy acceptance tests run this command:: - - paver test_bokchoy - -Once the database has been set up and the static files collected, you -can use the 'fast' option to skip those tasks. This option can also be -used with any of the test specs below:: - - paver test_bokchoy --fasttest - -For example to run a single test, specify the name of the test file:: - - paver test_bokchoy -t lms/test_lms.py - -Notice the test file location is relative to -common/test/acceptance/tests. This is another example:: - - paver test_bokchoy -t studio/test_studio_bad_data.py - -To run a single test faster by not repeating setup tasks use the ``--fasttest`` option:: - - paver test_bokchoy -t studio/test_studio_bad_data.py --fasttest - -To test only a certain feature, specify the file and the testcase class:: - - paver test_bokchoy -t studio/test_studio_bad_data.py::BadComponentTest - -To execute only a certain test case, specify the file name, class, and -test case method:: - - paver test_bokchoy -t lms/test_lms.py::RegistrationTest::test_register - -During acceptance test execution, log files and also screenshots of -failed tests are captured in test\_root/log. - -Use this command to put a temporary debugging breakpoint in a test. -If you check this in, your tests will hang on jenkins:: - - breakpoint() - -By default, all bokchoy tests are run with the 'split' ModuleStore. To -override the modulestore that is used, use the default\_store option. -The currently supported stores are: 'split' -(xmodule.modulestore.split\_mongo.split\_draft.DraftVersioningModuleStore) -and 'draft' (xmodule.modulestore.mongo.DraftMongoModuleStore). This is an example -for the 'draft' store:: - - paver test_bokchoy --default_store='draft' - -Running Bok Choy Accessibility Tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -We use Bok Choy for `automated accessibility testing`_. Bok Choy, a UI-level -acceptance test framework for writing robust `Selenium`_ tests in `Python`_, -includes the ability to perform accessibility audits on web pages using `Google -Accessibility Developer Tools`_ or `Deque's aXe Core`_. For more details about -how to write accessibility tests, please read the `Bok Choy documentation`_ and -the `Automated Accessibility Tests`_ Open edX Confluence page. - -.. _automated accessibility testing: https://bok-choy.readthedocs.org/en/latest/accessibility.html -.. _Selenium: http://docs.seleniumhq.org/ -.. _Python: https://www.python.org/ -.. _Google Accessibility Developer Tools: https://github.com/GoogleChrome/accessibility-developer-tools/ -.. _Deque's aXe Core: https://github.com/dequelabs/axe-core/ -.. _Bok Choy documentation: https://bok-choy.readthedocs.org/en/latest/accessibility.html -.. _Automated Accessibility Tests: https://openedx.atlassian.net/wiki/display/TE/Automated+Accessibility+Tests - - -**Prerequisites**: - -These prerequisites are all automatically installed and available in -`Devstack`_ (since the Cypress release), the supported development environment -for the Open edX platform. - -.. _Devstack: https://github.com/edx/configuration/wiki/edX-Developer-Stack - -* Mongo - -* Memcache - -* mySQL - -To run all the bok choy accessibility tests use this command:: - - paver test_a11y - -To run specific tests, use the ``-t`` flag to specify a pytest-style test spec -relative to the ``common/test/acceptance/tests`` directory. This is an example for it:: - - paver test_a11y -t lms/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 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The following are ways in which a developer could shorten the development -cycle for faster feedback. The options below can often be used together. - -**Multiprocessing Mode** - -Bok-choy tests can be threaded using the `-n` switch. Using 2 threads generally -reduces test cycles by 33%. The recommendation is to make sure the -number of threads is no more than the number of processors available. For -example, the Cypress release of devstack is provisioned by default with 2 -processors. In that case, to run tests in multiprocess mode:: - - paver test_bokchoy -n 2 - -*Caveat*: Not all tests have been designed with multiprocessing in mind; some -testcases (approx 10%) will fail in multiprocess mode for various reasons -(e.g., shared fixtures, unexpected state, etc). If you have tests that fail -in multiprocessing mode, it may be worthwhile to run them in single-stream mode -to understand if you are encountering such a failure. With that noted, this -can speed development for most test classes. - -**Leave Your Servers Running** - -There are two additional switches available in the `paver test_bokchoy` task. -Used together, they can shorten the cycle between test runs. Similar to above, -there are a handful of tests that won't work with this approach, due to insufficient -teardown and other unmanaged state. - -1. Start your servers in one terminal/ssh session:: - - paver test_bokchoy --serversonly - - Note if setup has already been done, you can run:: - - paver test_bokchoy --serversonly --fasttest - -2. Run your tests only in another terminal/ssh session:: - - paver test_bokchoy --testsonly --fasttest - -You must run BOTH `--testsonly` and `--fasttest`. - -3. When done, you can kill your servers in the first terminal/ssh session with -Control-C. *Warning*: Only hit Control-C one time so the pytest framework can -properly clean up. - -Acceptance Test Techniques -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -1. **Element existence on the page**: Do not use splinter's built-in browser - methods directly for determining if elements exist. Use the - world.is\_css\_present and world.is\_css\_not\_present wrapper - functions instead. Otherwise errors can arise if checks for the css - are performed before the page finishes loading. Also these wrapper - functions are optimized for the amount of wait time spent in both - cases of positive and negative expectation. - -2. **Dealing with alerts**: Chrome can hang on javascripts alerts. If a - javascript alert/prompt/confirmation is expected, use the step 'I - will confirm all alerts', 'I will cancel all alerts' or 'I will anser - all prompts with "(.\*)"' before the step that causes the alert in - order to properly deal with it. - -3. **Dealing with stale element reference exceptions**: These exceptions - happen if any part of the page is refreshed in between finding an - element and accessing the element. When possible, use any of the css - functions in common/djangoapps/terrain/ui\_helpers.py as they will - retry the action in case of this exception. If the functionality is - not there, wrap the function with world.retry\_on\_exception. This - function takes in a function and will retry and return the result of - the function if there was an exception. - -4. **Scenario Level Constants**: If you want an object to be available for - the entire scenario, it can be stored in world.scenario\_dict. This - object is a dictionary that gets refreshed at the beginning on the - scenario. Currently, the current logged in user and the current - created course are stored under 'COURSE' and 'USER'. This will help - prevent strings from being hard coded so the acceptance tests can - become more flexible. - -5. **Internal edX Jenkins considerations**: Acceptance tests are run in - Jenkins as part of the edX development workflow. They are broken into - shards and split across workers. Therefore if you add a new .feature - file, you need to define what shard they should be run in or else - they will not get executed. See someone from TestEng to help you - determine where they should go. - - Also, the test results are rolled up in Jenkins for ease of - understanding, with the acceptance tests under the top level of "CMS" - and "LMS" when they follow this convention: name your feature in the - .feature file CMS or LMS with a single period and then no other - periods in the name. The name can contain spaces. E.g. "CMS.Sign Up" - - Testing internationalization with dummy translations ---------------------------------------------------- @@ -645,7 +402,7 @@ Other Testing Tips Connecting to Browser --------------------- -If you want to see the browser being automated for JavaScript or bok-choy tests, +If you want to see the browser being automated for JavaScript, you can connect to the container running it via VNC. +------------------------+----------------------+