-
-
Notifications
You must be signed in to change notification settings - Fork 408
Semantic Test Selectors #327
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
That was a good read. When you say "perceivable", does that mean CSS visibility of parent elements is taken into consideration? For example, an accordian (that hides content instead of destroying) with a "Save" button in each. Since the end user only "perceives" one save button at a time, do I need to take any steps to differentiate the buttons for testing? |
@kellyselden yes, we’d want it to behave exactly the same way the accessibility tree (and by extension the screen reader) does. It’s a very important point, and we should add it to the RFC. |
|
This is one of the two approaches to selecting test elements that I currently hear about:
Adding perceivable text as an easy built-in option seems like a no-downside. But before moving to it as a default, it would probably be good to weigh the pros and cons of perceivable text vs. test-specific selectors in a variety of ecosystems. Kent could probably provide good rationale on why he's moving to prefer perceivable text. It could also be useful to get a survey of experienced Rails devs to see if many of them experience the downsides of selecting by perceivable text. Personally I've used both approaches, but I've mostly worked on projects small enough that either has worked fine. Folks in larger/older codebases could probably provide better perspective. |
@CodingItWrong I completely agree and hope that the comment thread on this RFC will yield some case studies to get us started. Anecdotally, my own experiences using perceivable text via Capybara were always very pleasant, but then again I wasn’t interacting with complex custom components of the type found in modern web apps. |
|
@jgwhite Same, I have a few years of heavy Rails experience and only brief frontend JS app experience so far. |
|
@kentcdodds just to let you know, this RFC is inspired by (and cites) your work on react-testing-library and dom-testing-library. I’m pretty convinced we can build atop dom-testing-library (if the community is in favour of the proposal of course). Thanks for blazing the trail! |
9926b17 to
975240d
Compare
|
I think this is a good idea, and given that current helpers already accept dom elements as well as css selectors, implementation is pretty easy. P.e., a semantic // fill-in.js
import { fillIn as rawFillIn } from '@ember/test-helpers';
export async function fillIn(label, text) {
let inputElement = findInputLabeled(label); // throws error if not found
return rawFillIn(inputElement, text);
}I like it. I'm not 100% convinced it should be part of the default blueprint, tho. |
|
@cibernox agreed, implementation should be very achievable, and the fidelity of “semantic lookup” can improve over time.
Could you say more? To clarify: I’m advocating for default status in the far future, after this has had a chance to cook in the community cauldron. |
@jgwhite Perhaps it may be too early for an RFC then, as it hasn't spent enough time "cooking" and refining? Just a thought. |
|
@jgwhite What I don't like a lot is having two I am thinking that perhaps after some experimentation, we could unify them. // click.js in @ember/test-helpers
export default async function(selectorOrText) {
if (selectorOrText instanceof HTMLElement || isSelector(selectorOrText)){
// current behaviour
} else {
// semantic behaviour
}
}That way we wouldn't have to choose between semantic vs css-based when importing the helpers. |
Yes and no. I strongly believe this should be part of the mental model for testing in Ember, and RFCs are the best way to plant that seed. While I would love to have a published implementation of `ember-semantic-test-helpers‘ to go along with this, I think getting the community aligned on the principles is a more significant step. Plus, I’m far too lazy to create and maintain an addon 😄 |
|
@cibernox yep that’s an interesting alternative. I’ll add it to the relevant section. I considered it when preparing the talk, but concluded that if it was feasible to implement Definitely interesting territory to explore. |
|
I am not aware of the position of Ember.js approach to page objects, but there is an addon which implements this pattern more "traditionally", however very similarly to the proposed approach. http://ember-cli-page-object.js.org/docs/v1.14.x/ Maybe this can be useful on the RFC refinement. |
|
@JoaoGFarias thanks for bringing page objects into the conversation. I think page objects and the semantic approach can complement each other. I know the page objects team have been thinking along similar lines. |
|
Can we target by the key we are using for i18n rather than the ultimate value? |
@Gaurav0 I think that would be a really cool enhancement. It is, in a sense, another facet of creating accessible/inclusive apps. Fuel for a future RFC perhaps? |
Interesting. I'd say that anything that does not start with |
|
what about |
touché, and with custom element the task is essentially impossible. I take it back then. |
You never know, it might be tractable, and it would be very cool. |
|
I do find this approach interesting, though certainly it needs some thorough discussion and maybe some early implementation to play with and experiment... I'm a bit concerned about the brittleness you already addressed. We generally use i18n to centralize all labels even for apps that are not (yet) multi-languange, so non-devs can also easily contribute wording changes. Would certainly confuse them a lot when a simple change would cause their PR to go red... Regarding the non-unique labels issue, I would think about introducing another concept to disambiguate, which is "context". Technically this would just be scoped selectors instead of the global ones, so you can distinguish say the email input of the sign-in form from the same one within the sign-up form, even if their labels, title etc. are exactly the same. But that's not only a technical workaround, I think it could play just nicely with the overarching concept of user perception, as users do perceive context. For visual perception, things like positioning, spacing etc. convey meaning, they connect or separate different elements semantically. But I guess screen readers will also provide that context (given accessible markup), so users will know that the currently focused input is within the sign-up form for example. Example: await fillIn('Password', 'topsecret', 'Sign up');The third param could be optional, but if present will add a scope to the selector. In this case this could match a password field that is inside a form that has a |
@simonihmig great observation. Capybara has the within('div#delivery-address') do
fill_in('Street', with: '12 Main Street')
end |
@simonihmig this is my main concern too. Then again, maybe introducing extra rigour into copy changes is desirable? Or perhaps @Gaurav0’s idea of i18n-key-as-selector. I must say, in every codebase I’ve worked on the internationalised strings were chaotically organised so figuring out the correct key always involved trial-and-error. I suspect something that enforced a set structure would be welcome. |
|
Excuse me, but we already have at least two brilliant libraries for semantic tests -- ember-page-objects and ember-test-selectors the second Both are very semantic |
|
@chilicoder Those libraries do not solve the problem this RFC is trying to solve: they do not enforce a11y. Perhaps the title should of the RFC should include the word accessibility? |
@chilicoder indeed. Both approaches are wonderful but neither require that the elements in question have perceivable descriptive labels. That is the main motivation of this RFC |
|
@jgwhite Are the other two motivations listed in the RFC equal in your mind to accessibility? I probably don't prioritize accessibility as highly as I ought. For me, the "Cleaner Tests" motivation is more motivating, so I think that's worth keeping in the conversation. |
@CodingItWrong I believe all three together make the strongest case. Someone could successfully argue that the accessibility motivation is satisfied by other means (linting, ember-a11y-testing) and the other two motivations would still provide reason to consider the proposal. I think the only real innovation of this RFC is to marry accessibility with test ergonomics. Turns out they go together really well! |
|
Hi! We're using Cucumber in our app (via When user clicks foo
When user clicks bar
When user clicks bazEach of those thousands steps has a unique implementation: {
"when user clicks foo"() {
return pageObject.foo.click();
},
"when user clicks bar"() {
return pageObject.bar.click();
},
"when user clicks baz"() {
return pageObject.baz.click();
},
}As you can see, these are very repetitive and rely on page objects heavily. By following this RFC, 80% of our step implementations can be reduced to a few universal ones: {
"when user clicks `$label`"(label) {
return clickByLabel(label);
},
}This has the potential of both improving accessibility AND drastically simplifying our test codebase! 🎉 👯♀️ 🍾 One thing I'm concerned though is nested invocations. We won't be able to guarantee uniqueness of labels because:
For example, this is gonna be a very typical case: When user clicks on `Expand` of `Activity item 5` under `Project activity group Tuesday, March 24` This RFC needs details on:
PS Is somebody already using this approach via custom implementation or addon? |
|
Is there a reason that you can’t do "when user clicks $string"(selector) { I have a similar solution where I’ve written a regex that matches css selectors and I have a generic step for “when I click on $selector” using find. |
|
@BryanCrotaz Yes, several, actualy:
I find page objects a powerful tool, but 80% of them is just clicking, filling and reading text on selectors. Why maintain an army of them, if human readable, a11y-empowering labels can be used directly in step names? |
|
@lolmaus here's how I did it: Implementing this RFC will be great, but in the mean time this technique would get rid of your thousands of custom steps. |
|
Thx for sharing! Got a couple of questions:
Anyway, this is not relevant to the RFC; and in real-life scenarios steps like |
|
@lolmaus thanks so much for your feedback. Regarding nested items and items in lists… If I recall correctly Capybara has a within ".some-selector" do
click "Some button"
endPersonally I always found this approach very readable. Not quite sure how you marry it with Cucumber/Gherkin but that’s potentially out of scope for this discussion. However, coming at this from the a11y perspective, I think we can nudge the conversation in a slightly different direction. Let’s look at your (perfect) example: In a test following this RFC I would like to be able to write: await click('React with a heart to billybonks’ comment “I’m going to go through all the ideas…”');And this string would actual be present in <button aria-label="React with a heart to billybonks’ comment “I’m going to go through all the ideas…”">❤️</button>Adding this specificity is beneficial for testing and for accessibility too. Particularly with screenreaders that feature something like VoiceOver’s “rotor” which will present all links on a page, in order but out of context, for rapid navigation/interaction. The above is covered in the non-unique labels section of the RFC. |
Real world
Yes. I've got lots of steps, just pulled out the simpler ones. It's an html editor, so it has drag, resize, click at coords steps and various others.
Agree it's off-topic, just suggesting a simplification of your thousands of steps in the mean time. |
|
@jgwhite Thanks for your answer! Before I comment on it, let me explain where I stand. I'm currently introducing BDD & Cucumber to my project and my team. There's a pending debate on pros vs cons, and not everyone on the team recognizes the virtues of BDD. Also, not everyone agrees that the complexity increase that comes with Cucumber is worth it. So my goal is to maximize the benefit of Cucumber while minimizing its impact on complexity. When I listened to your Say More™ talk, I was amazed with the idea of semantic selectors. By using semantic selectors directly in user stories, I can achieve multiple benefits at once:
I'm extremely excited about that. The a11y-empowering potential of this RFC is truly amazing, but I would like to emphasize that semantic test selectors aren't only about a11y. My goal here is to defend the needs of usual testing practices. I want semantic test selectors in Ember to be full-featured and covering all the testing needs, without having to revert to old-school selectors. I could come up with my own semantic selectos addon that would perfectly satisfy all the testing needs (and I'm very excited to try). But the result will not be a11y-aware because currently I know nothing about a11y. 👎 This RFC has the potential of killing two exceptionally prized birds with one stone: BDD and a11y. a11y is a very noble goal, but as we pursue it we must make sure not to sacrifice normal testing needs. Let's make sure that both goals are fully satisfied. I believe we have a good chance to succeed, let's not consider reverting to old-school selectors an offical way to fill the normal testing flaws of this RFC. A necessity to combine both approaches will be an indication that this RFC has failed. Now back to your suggested solution! Though it seems nice from the a11y perspective, unfortunately, it has a whole lot of flaws from the test-coding perspective:
Again, I could propose a semantic testing strategy that has all of these issues resolved -- but it will not be a11y aware. So let's cooperate! Regardless of the above, this RFC requires explicit guidelines on how exactly to apply labels to HTML elements and Ember components: what attributes to use in which situations, etc. The addon could provide some tools for that, or we could cooperate with ember-a11y-landmarks. |
Beautifully put.
Very true. I should add this to the drawbacks section of the RFC. I will note that this can be a footgun for visual regression testing tools like Percy too.
This is a very interesting example. Let’s reframe it in human terms: if you were asking a screen reader user to count the number of comments on the page, how would you tell them to identify a comment? There’s actually a really great answer for this: accessible HTML semantics. When a screen reader encounters a The HTML could be: <ul aria-label="Comments">
<li>…</li>
<li>…</li>
<li>…</li>
<li>…</li>
<li>…</li>
</ul>Or: <section aria-label="Comments" role="list">
<article role="listitem">…</article>
<article role="listitem">…</article>
<article role="listitem">…</article>
<article role="listitem">…</article>
<article role="listitem">…</article>
</section>Or: <h2 id="comments-title">Comments</h2>
<section aria-labelledby="comments-title" role="list">
<article role="listitem">…</article>
<article role="listitem">…</article>
<article role="listitem">…</article>
<article role="listitem">…</article>
<article role="listitem">…</article>
</section>I think this is wonderful because it gives us a precise, prescriptive way to select for elements in our test, dervied from standard HTML+ARIA semantics. I can imagine the Gherkin statement being: Given a PR with 5 comments
When I visit the PR page
Then there should be a list labelled “Comments” containing 5 itemsYour example was so provocative that I ended up writing a lot more than I intended. I’ll try to address the other points later on in the day (or perhaps someone else will address them (probably better than me!)). |
|
I think the way that i would have built this test with my team is: the struggle i have is To understand which is the better approach would require user testing, because there may be ways, to build these labels and another way may have a better experience. in the latter it sounds like every button is going to have the extra information of the comment. i think it's more preferable if the SR said: "I’m going to go through all the ideas…" but if the latter is the better experience i also have an idea that i want to implement soon being
the within helper is already built, so is the
When i read power select code a while back, this was handled very well {{comment-component}} <---- uses ember generated id for example ('ember 1234') given this way of applying id's you rely on ember to use a unique prefix and you concatenate that prefix, this way you have confidence in having unique id's this can be quite verbose given certain use cases, but very powerful in others. {{text}} |
|
@jgwhite You essentially suggest that an item component has no label to semantically identify its type. We can only reference it in the context of its parent: Then 5th item of the `Comments` list should say `I'm going to go through all ideas`I would like to be able to say simply: Then 5th `Comment` should say `I'm going to go through all ideas`The difference may seem minor in this example. But as we pursue the goal of targeting a reaction emoji on the Changes tab, we impose a lot of complexity. Labels become enormously long. While this is a necessity for that particular case, it becomes a nuisance for simpler cases. When there's a unique but deeply nested component, say, a subscribe button, I want to target it simply with its semantic name: But the methodology we're inventing here must be universal. It can't be hand-tailored to each individual case. Because components are invoked by components which are invoked by components.... They all must be relying on some default way of composing labels. And from the route template, there is no simple way to tell the innermost component to switch from the default strategy to another one. @billybonks says:
This means that we must come up with a strategy that all pages and components will follow. It must be flexible and powerful, it must satisfy all the usual testing needs and a11y needs at the same time. Thus, I'd rather have each component have a short semantic label that corresponds to the component's name: <section aria-label="Comments" role="list">
<article role="listitem" aria-label="Comment">…</article>
<article role="listitem" aria-label="Comment">…</article>
</section>This gives us flexibility:
Note that you can switch from one approach to the other anytime, without having to change the labelling scheme. This way, the code is also not prone to any of the issues I mentioned in my previous comment. Note that element body remains available to screen readers. @billybonks, your code sample is definitely inspired by Ruby. Unfortunately, JS does not work like that: in your code the There are several ways to work around this.
(Note that I believe all these variants are too funky and force you into deep nesting (in complex cases). I'd rather go with a simpler approach: const parent = findByLabel("I'm going to go");
return clickByLabel("add heart emoji", parent);This scales well without nesting: const file = findAllByLabel("File")[4];
const line = findAllByLabel("Line", file)[27];
const comment = findAllByLabel("Comment", line)[0];
return clickByLabel("Add heart emoji", comment);With the upcoming pipe operator and partial application language features, intermediate variables could be avoided: return findAllByLabel("File")
|> objectAt(?, 4)
|> findAllByLabel("Line", ?)
|> objectAt(?, 27)
|> findAllByLabel("Comment", ?)
|> objectAt(?, 0)
|> clickByLabel("Add heart emoji", ?) |
<section aria-label="Comments" role="list">
<article role="listitem" aria-label="Comment">…</article>
<article role="listitem" aria-label="Comment">…</article>
</section>This seems great to me (assuming it works well for screen reader users). The high order bit, as far as I’m concerned, is that for something to meaningfully accessible in a test it should also be meaningfully accessible to a screenreader. What you’ve proposed above is a splendid example of this philosophy in practice. |
I am taking advantage of javascript being single threaded. The library has a singleton config class where you can set a root element import { config } from 'semantic-dom-selectors';
export default async function within(selector, func) {
let newRoot = document.querySelector(selector);
let oldRoot = config.rootElement;
try {
config.rootElement = newRoot;
} catch (e) {
throw Error(`within Error: Selector '${selector}' was rejected:\n${e}`);
}
await func();
config.rootElement = oldRoot;
}
that is correct i made a mistake in my example within("i'm going to go through all the ideas in comments and take ideas from initial implementation apply changes to RFC so that we can go to fcp", async function() {
await click('add heart emoji');
return click('add smile emoji');
});
assert.list('comments').hasNItems(5);
given that this is working, because it does i use it in production app testing, would you consider it?
const file = findAllByLabel("File")[4];
const line = findAllByLabel("Line", file)[27];
const comment = findAllByLabel("Comment", line)[0];
return clickByLabel("Add heart emoji", comment);in it's current form it will throw an error i would argue that the above is bad fro screen readers, because firstly it should say which line you are focused on and which file you are focused on. within('File index.js', function() {
return within('Line 27', function() {
return within("I'm going to go through all the ideas in comments and take ideas from initial implementation", function() {
return click('Add heart emoji')
})
})
})but the comment string is probably unique so you can use it without nesting. within("I'm going to go through all the ideas in comments and take ideas from initial implementation", function() {
return click('Add heart emoji')
})I have constrained the api on purpose because it is easier to open it later then to constrain it later, when we know all the best practices. but at the same time i have allowed points of configuration where you can overcome issues of best practice to be able to enjoy the erganomics. for example it is possible today to write this. if when the community around the add is larger and we can get more opinions and have a better knowledge of how to craft a good accessible app, we can change the API, because we started with a constraint API. I really appreciate your use case, because it tests the API, given that i would be happy to pair with you if you want, in order to test out these cases in practice. I think it would be extremely beneficial, as part of the evolution of the addon. |
|
@billybonks This trick means that you can't use vanilla |
|
That is true but if you have to fallback, to native click you can use CSS ?
Ideal case is you don't have to
…On Thu, 13 Sep 2018, 15:24 Andrey Mikhaylov (lolmaus), < ***@***.***> wrote:
@billybonks <https://github.com/billybonks> This trick means that you
can't use vanilla click helper inside within (and any other stuff other
than what's offered by semantic-dom-selectors). :(
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#327 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/ABkGyNfwWwOH0v6r5DNqtUxhp0Vj3_YBks5ualyegaJpZM4Tb66Q>
.
|
|
The "Say more" talk and this RFC have inspired me to convert my test codebase to semantic selectors, getting the following benefits:
I've achieved this by essentially reverting to the Test Selectors pattern (see simplabs/ember-test-selectors and Ticketfly/ember-hook). But instead of using ad-hoc, machine-readable values, I went with semantic, human-readable ones. I am extremely satisfied with the result and I would like to kill two birds with one stone and reuse those semantic attributes for a11y. I researched a11y and ARIA a bit and discovered, that there is no straightforward way to do it. Unfortunately, the WAI-ARIA spec is extremely limiting. I went back and re-read this RFC, hoping to find a way to fix this. I was discouraged to find out that it doesn't provide anything like that. It only provides For this RFC to be useful for me, it should offer the following:
@jgwhite and @billybonks, I believe you should ask yourself these questions:
If the answer is no, then I suggest that you rename this RFC to something less ambitious, so that the scope of the RFC title does not exceed the actual effort of the RFC. For example: " And if the answer is no, you should also consider leaving this effort to an addon. I do acknowledge the importance of a11y and I understand the desire to impose a11y in an Ember best practice. But if this RFC is merged in this current form, are you sure it will not end up being known as "Those two weird helpers? Yeah, I tried them a couple of times but they're not matching my elements, dunno why. And I can't figure out how they can make my test code semantic... They are so perfect in theory, but my test code is just too down-to-earth for those idealistic helpers to fit in... I guess a11y is not for me." |
|
@lolmaus thank you for thinking about this so deeply and testing the ideas so extensively on a real project. At this point you have arguably thought more deeply about this than I have but I’ll give you my takes:
Am I understanding correctly that you’d like to use
Perhaps the RFC doesn’t state this explicitly enough, but developers should always be able to switch to variants of
I think it’s perfectly acceptable to “drop down” to CSS selector based helpers where necessary.
Do you think these points could be addressed by adding a semantic variant of function find(label: string, scope?: HTMLElement): HTMLElement | null@billybonks could we add such a function to the
I don’t think this is universally attainable. As above, I’d say it’s perfectly acceptable to use a CSS selector if there is no perceivable semantic element that can easily be used as a reference.
As above, a semantic let form = find('The legend of a form').form;
let field = find('Email', form);
await triggerKeyEvent(field, 'keypress', 127);I’m using
Would you mind giving some examples of cases where they’ve gotten unwieldy? (Arguably my example above of “ React with a heart to billybonks’ comment…” is a pretty unwieldy but I’d love to see some real-world examples too.
Haha, indeed. Though I would say the means of generating test fixture data contributes to such pitfalls.
Agreed. Let me say again how much I appreciate the thought you’ve put into this. I think it’s a fantastic outcome that you’re able to clearly provide an “acid test” or “acid thought experiment” that can help us determine whether it’s feasible to move forward with this approach as the default or not. If this RFC ends up not being merged and we take the addon route, I’d say that’s still a fantastic outcome. Personally, I feel strongly that we can strive for “semantic by default” as the ultimate goal. I don’t think it would need to be a universal solution—abstractions always need escape hatches, after all—but if that’s the topic of another RFC in a year’s time, so be it. |
|
@jgwhite Thank you for tolerating my manner. I often get bitter and aggressive, while internally I perceive my language as passionate and truth-seeking, not realizing how offensive it may be until too late. I really appreciate you not taking it personally. 🙇
Yes, that was what I attempted at certain point. I wanted to kill two birds with one stone: have semantic labels and also improve a11y (in a quite imperfect but still valuable way). But then @vvainio came and showed me this comment by @jared-w-smith:
Too bad this fact is so obscure, almost secret knowledge. If not @jared-w-smith, we would fall into this trap. I found no alternative to So we decided to switch back to
The matter is that I don't want to be limited to perceivable elements. My dream here is to be able to replace selectors that hardcode DOM hierarchy with semantic, human readable ones. And they should be able to cover all possible testing situations, not just the ones covered by WAI-ARIA. Note that this RFC is titled
I agree that it is important to provide a way to fall back to CSS selector-based helpers. But I believe a "Semantic Test Selectors" RFC must provide a way to fully rely on semantic selectors. If the RFC forces me to mix both approaches, I believe many develoeprs will find little value in it.
Yes. But it must be possible to look up any element, not only landmarks, widgetds and interactive elements.
I believe it already exists in tradegecko/semantic-dom-selectors. But it's not documented and it does not accept a context (parent scope) argument.
I can't since I still don't understand how perceivable text works. But the example you mentioned startles me: what if there are two similar comments that only differ starting from the 1000th character. Do my semantic selectors have to be 1K long? 😱 And what if two comments are entirely identical? There will be an error that the RFC provides no way to recover from, except for reverting to CSS selectors. And if I know I'll have to revert sooner or later, why bother doing it in the first place? I must say that my teammate said that the RFC felt immature & naive, and I couldn't disagree.
It could be. It just has to have a non-magical API. It could even have a counterpart in But the existence of I now feel that My effort to turn this RFC into the direction that satisfies my personal needs -- now seems naive. There is no way we can change how WAI-ARIA and screen readers work. So if you also don't see a way to fully replace |
While I find the rest of your tone very balanced, it was pretty hard not to feel personally hurt by this statement. Honestly, you needn’t have included it. |
|
@jgwhite Sorry, that was only a reference to the to the stage of this RFC development. RFCs mature over time and get rid of "teething problems" as they are discussed and applied to real-life use cases. All I meant was that this RFC was yet to resolve its issues. |
|
@lolmaus thanks for clarifying. |
|
@jgwhite we are looking at this RFC in the core team- would you be update the RFC to address internationalization? |
|
@MelSumner certainly, though it’ll take me a little while to get my head back into it. What kind of timeframe do I have to work with? |
|
This RFC proposes only implementation of I think at the least it should also propose The |
|
@mixonic I’m tempted to reformulate this RFC around the two libraries that @billybonks devised (https://github.com/tradegecko/ember-semantic-test-helpers and https://github.com/tradegecko/semantic-dom-selectors) which provide |
|
Time to close this RFC I think! The ideas in the RFC became a reality in ember-semantic-test-helpers. Additionally, we now have hooks in ember-testing and usage of said hooks in ember-a11y-testing, which far exceeds my original ideas for pluggable test helpers. I’m grateful for everyone’s contributions to this RFC, and for the advances in Ember’s testing story. |

Rendered
My intention is to follow this RFC with a second, further exploring the ideas from the talk (watch this space).