Code Monkey home page Code Monkey logo

zen's Introduction

Zen is an absurdly fast test runner. How fast? At Superhuman, running all 2.8k tests locally took about 30 minutes. With Zen, it takes 10 seconds. There are 3 main parts:

Lambda workers - when running all tests, Zen uploads your code to an S3 bucket and then spins up 600 Chrome instances in AWS Lambda to run all your tests.

Headless workers - when you're running fewer tests (say, just one describe block) Zen will run your tests on a pool of local headless Chrome instances.

Zen UI - Let's you see which tests failed, and run them in the current tab to debug. When running in a tab, Zen shows you all the rendered DOM, making it a decent replacement for Storybook.

Setup

This is a bit rough. Sorry! Hopefully soon I'll automate all this ๐Ÿ˜€

Deploy S3 bucket

We're going to put some build artifacts in this bucket before deploying the full stack.

aws cloudformation deploy --stack-name zen --template-file node_modules/@rogueg/zen/lib/aws/aws-bucket-only.template --capabilities CAPABILITY_NAMED_IAM

Making Chrome Layer

You need a Lambda Layer that has a chromium binary. I've been using the excellent https://github.com/alixaxel/chrome-aws-lambda, but it requires a bit of work.

  1. Download release for the version of Chrome you'd like
  2. Use brotli to decompress bin/chromium.br
  3. Create a zip file with just the decompressed chromium
  4. Upload to the bucket
  5. Use AWS's Lambda UI to create a layer from that zip
  6. Get the ARN for the layer, and put it in node_modules/@rogueg/zen/lib/aws/aws.template (I told you this was rough)

Make lambda code

You'll also need a zip of lib/local-server/chrome.js, lib/aws/lambda.js, and chrome-remote-interface. Upload it to the bucket as lambda-code.zip

Deploy stack

This will deploy all the rest of the formation.

aws cloudformation deploy --stack-name zen --template-file node_modules/@rogueg/zen/lib/aws/aws.template --capabilities CAPABILITY_NAMED_IAM

Config

Finally, create test/zen.config.js. Mine usually looks like this:

const webpackConfig = require('../webpack.config.js')

process.env.NODE_ENV = 'test'
webpackConfig.mode = 'development'
webpackConfig.entry = {bundle: ['./test/setup.tsx']}
webpackConfig.output.publicPath = 'webpack/'
webpackConfig.devtool = 'eval'

module.exports = {
  aws: {
    region: 'us-west-2',
    accessKeyId: 'XXX',
    secretAccessKey: 'XXX',
    assetBucket: 'XXX',
  },
  webpack: webpackConfig,
}

Developing

yarn link
zen local

zen's People

Contributors

hehk avatar rogueg avatar sdemjanenko avatar timothee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

zen's Issues

Ideas

  • Better distribution of tests between workers
  • Zoom into to a single suite (split tests across workers)
  • Detect flaky tests
  • Auto-run tests based on file changes/dependency graph

Break-on-exception doesn't work for forked promises

Chrome's break-on-exception doesn't always break when exceptions are thrown in a promise callback.

it('confuses me', () => {
  let start = new Promise(r => setTimeout(r, 10))
  let forked = delay.then(() => { throw "huh" })
  return wantBroken ? forked : start
})

Returning start works fine, but returning forked won't break (but it does print to the console). If you add a catch block to runTest, it catches the error, so it's not like the promise is just swallowing it.

I've also noticed that bluebird promises don't have this issue. The problem with bluebird is that stack traces are very wrong (even with longStackTrace on).

I think the ideal would be to figure out how bluebird does it, and replicate.

v1

  • run webpack server for assets
  • supports describe/it/before/after syntax
  • Request test suite to run
  • Load suite
  • Run suite, report result to server
  • Display results in head
  • Run failed tests in head
  • Get all suites in directory
  • Launch workers

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.