coveragepy icon indicating copy to clipboard operation
coveragepy copied to clipboard

Screen-reader accessibility in html report

Open vincent-lg opened this issue 4 years ago • 3 comments

coverage is a great tool, complementing unit testing to create more stable projects. Developers using screen-readers, like myself, might have some difficulty in trying to improve coverage of their project.

Problem

Although html is a detailed report, its accessibility with a screen-reader could be improved without so much effort. Alternatively, to have these information in console, for instance, could also be extremely useful, but this issue focuses on the HTML report.

Currently

The html main report (the one you would access through the index.html file) is accessible as-is. Things get a bit more complicated when opening the report of a specific file:

  • I can see the coverage summary: "Coverage for context\base.py : 28%", then a bit below "79 statements   22 run 57 missing 0 excluded".
  • I can see the individual lines of the file with line numbers.
  • I can't easily see which line / statement is tested (covered) and which one is not.
  • It seems clicking on the buttons ("79 statements", "22 run", "57 missing", "0 excluded") doesn't do anything, although it might do so, visually.
  • It seems I can't click on the "short shortcut keyboard" image. The screen-reader sees it as an image, clicking on it doesn't display anything. Note that screen-readers support keyboard shortcuts of their own, and shortcuts that conflict with screen-readers might be hard to get around for users.

What I suggest

Line information

The most important issue is the impossibility to know what a line is: covered, not covered, not important. This is presumably done with colors, and the screen-reader can access colors, but you need to request colors on any particular line. Which doesn't make the experience that fluid. Tested with NVDA (Non-Visual Desktop Access), when pressing NVDA + F to see the color information on a line, I get something like this:

Consolas, 11pt, light grey on white, baseline, align right

As you can imagine, inferring what this means can be tricky and, anyway, there's a lot of information that's not exactly needed.

What to do? There are a few possibilities: adding a text (or even a symbol) only the screen-reader perceives and that is not displayed to most users. Bootstrap supports it with the "sr-only" class for instance. I'm not sure what you're using. This symbol (or label) could be inserted before line numbers, like this:

Missing : 322, def call_in(seconds, callable, *args, **kwargs): 

Alternatively, instead of a clear label, this could be a short symbol, something straight-forward enough:

m322, def call_in(seconds, callable, *args, **kwargs): 

("m" standing for missing, a dot could stand for covered, an X for excluded, and so on.)

Filters

It might also be good to have the buttons above the report act as filters. If you click on "57 missing", for instance, then only missing statements would appear, excluded and not-run lines would just disappear. As stated above, this is not the case, though it might be visually. The screen reader doesn't see any difference, so clicking on these buttons doesn't accomplish much.

Keyboard shortcuts

It might be worth placing keyboard shortcuts on these buttons, if they behave like filters: number of statements, number of run statements, number of missing statements, number of excluded statements. If so, I recommend using the browser-compatible shortcuts on buttons and advise against coding such a thing in JavaScript.

Why? As stated, the screen-reader has its own shortcuts. For instance, pressing "h" will jump to the next header on the page. Almost every single key is linked to the screen-reader, and by default, most screen-readers only pass these shortcut keys if they don't map anything in their features. On the other hand, browser-compatible shortcuts always are safe from conflict. In Firefox for instance, adding a shortcut tag to a button enables the Alt + Shift + key shortcut, which is always free for screen readers. Besides, because it remains plain HTML, screen readers can often run a check on these shortcuts and see if they would pose an issue. Therefore, I advise using the HTML tags to link a key with a button and leaves the rest to the browser. Yeah, sometimes, best to trust the browser!

All this is recommendation of course, and I tried to detail it as much as possible, considering web accessibility can be tricky and often appears more complicated than it really is. I'm aware that this might need further discussion, and please don't hesitate to ask more questions. This post is already long and I don't wish to flood with unwanted information.

Thanks for the great work,

vincent-lg avatar Nov 17 '20 11:11 vincent-lg

@vincent-lg thanks for the detailed information. I'm familiar with these ideas, but have not done a good job carrying them through into the coverage report.

Definitely we can add information to each line for the screen reader. I welcome your recommendations for what would work best. Filtering lines is a thornier issue. The buttons at the top do filter the lines, but by changing their background color, not by removing them completely.

Can you say more about the browser-compatible shortcuts for the buttons? Google isn't helping me find the thing you seem to be talking about.

nedbat avatar Nov 17 '20 11:11 nedbat

I was actually about to raise an issue highlighting some of the accessibility points on the HTML form identified by a colleague but think they are mostly addressed above. Appreciate it is a few years old now.

I would be interested in helping contribute some of the components mentioned above.

Would it be sensible to try and split out a few individual but linked accessibility issues from the above?

proudfeet avatar Jul 05 '23 19:07 proudfeet

Thanks, I appreciate any help. If you have solutions, we don't need to make separate issues, the pull requests will be a fine start.

nedbat avatar Jul 05 '23 21:07 nedbat