Skip to content

Support running tests with limited resources (e.g. browser based)  #107

Description

@pawelpabich

Hi,

I've been looking for a while for a test framework that would let me run browser based tests in parallel and it looks like xUnit has most of the required features. I blogged a detailed analysis here (http://www.pabich.eu/2014/06/how-to-run-selenium-tests-in-parallel.html) but I will include all important information here so the discussion is self-contained. The purpose of this discussion is to see whether those missing features fit into the vision of the xUnit project and if so, how they can be implemented. Personally I believe that the famous extensibility capabilites of xUnit could help here a lot (e.g. custom test execution pipeline via a custom implementation of XUnitTestCase). And having one, instead of many frameworks, has its obvious adventages.

I forked xUnit https://github.com/pawelpabich/xunit to see if I can fill the gaps. This was easier than I thought it would be thanks to great condition the xUnit codebase is in. The whole excercise is more a Proof of Concept then a fully blown implementation but it works and it is used successfully in production.

I split the missing features into 3 groups:

  • must have (without them browser based tests won't be possible with xUnit),
  • should have (very,very usefull and it will make life much easier but not deal breakers)
  • nice to have (there is no rush to add those, but eventually it would good to have them)

Must haves

Report test result back to the test before it gets disposed

Tests need to know when they fail so a screenshot of the web browser can be taken. Current solution checks whether the test class implements certain interfaces, e.g. INeedToKnowTestFailure.

Execute the whole test as a single Task

Current design splits the execution pipline into mutliple tasks which means that Dispose method of an already executed test might be run with some delay which means more browser instances will be required than what MaxParallelThreads would suggest. In my tests I very often ended up with 2 or 3 x MaxParallelThreads number of browsers. Current solution is to execute the whole pipleline as a single Task

Should haves

Make unit of work more granular

At the moment the smalles unit of work for parallel processing is class. For long running tests this is not optimal as a class with a few long running tests can significantly slow down the whole build. Current solution introduces a new, per method, collection bahaviour.

Allow to order test collections

Assuming that we can have a test collection per test methed then the next logical step to minimize the exectuion time would be to have ability to order test collections to make sure the failed tests or/and tests with longest execution time are run first. Current solution is based on the existing extensibilty point for ordering tests within a test collection.

Nice to haves

Allow to perform global initalization

At the moment global initialization needs to happen in the instance constructor with global lock.

Allow to perform global clean up

Current workaround relies on subscription to AppDomain.Unload event which works most of the time but not always.

I really hope we can make it work :). Thoughts?

Metadata

Metadata

Assignees

No one assigned

    Labels

    By DesignThe issue is working as designedDiscussionNot yet ready for work. Some aspect of the issue or fix design is still being discussed.FeatureA request for a new feature

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions