Skip to content

Features

Vitali Haradkou edited this page Oct 14, 2021 · 9 revisions

1. Custom runner

import { Runner, RunnerLike } from '@magiqan/runner';

class MyOwnRunner implements RunnerLike{
 async run(){
     console.log('custom runner');
  }
  // other implementation
}

const myRunner = new Runner.override(MyOwnRunner, /** MyOwnRunner constructor args */[]);

await myRunner.run(); // prints: custom runner

2. Decorators support (aka Java, C#)

import assert from 'assert'

@testable()
class MyTestClass{
  @test()
  method(){
  assert.ok()
  }
}

3. Independent reporters

import { Runner } from '@magiqan/runner';
import { JSONReporter } from '@magiqan/reporter';

const runner = new Runner(__dirname);
const reporter = new JSONReporter('./out.json');
runner.addFile('./testFile.ts');

await runner.run(); // run tests

reporter.generate();

4. Pub/sub model

All events described here(insert link)

Custom events are also supportable

import {Event, events} from '@magiqan/events';

events.subscribe('runnerInit', (payload) => {
// do some with event data
})

events.subscribe('my event', (payload) => {
  console.log(payload); // prints: {custom: 'payload'}
})

events.emit(new Event('my event', {custom: 'payload'}));

5. Metadata Provider

// test.ts
import {testable, beforeAll, MetadataManager} from '@magiqan/core';

@testable
class A {
 metadata = new MetadataManager(this);
 @beforeAll()
 beforeAll() {
  this.metadata.defineMetadata('beforeAll', 'some key', 'some value')
  console.log('before all');
 }

 @test()
  someTest() {
    console.log('some test');
    this.metadata.defineMetadata('someTest', 'key', 'value')
  }
}
// index.ts

import {Runner} from '@magiqan/runner';

const runnner = new Runner(process.cwd());
runner.addFile('./test.ts');

const result = await runner.run();
console.log(result); 

/**
output:

[{
  "path": "<resolved path>/test.ts",
  "results": [
    {
      "name": "SomeTest",
      "result": "passed",
      "results": [
        {
          "start": 1634206879837,
          "result": "passed",
          "name": "beforeAll",
          "metadata": {
            "some key": "some value"
          },
          "stop": 1634206879839,
          "isHook": true,
          "kind": "beforeAll"
        },
        {
          "kind": "test",
          "name": "someTest",
          "start": 1634206879840,
          "isHook": false,
          "result": "passed",
          "metadata": {
            "key": "value"
          },
          "stop": 1634206879841
        }
      ],
      "start": 1634206879834,
      "metadata": {},
      "stop": 1634206879842
    }
  ],
  "result": "passed"
}]
 */

6. Base test

import {Test, testable, test} from '@magiqan/core';

@testable()
class A extends Test {
  @test()
  testMethod(){
    this.defineMetadata('testMethod', 'metaKey', 'metaValue');
    console.log('passed');
  }
}

7. Reporter extensible

// custom_reporter.ts
import {Reporter} from '@magiqan/reporter'

class MyReporter extends Reporter {}

// or

// file_reporter.ts
import {FileReporter} from '@magiqan/reporter'

class XmlReporter extends FileReporter {
  constructor(myFile){
    super(/** file path */, myFile);
  }
  onFileResult(result){
    this.stream.write(tansformResultToXML(result));
  }
}

tansformResultToXML(result){
// define transformation
}

// or HTTP reporter

import {HTTPReporter} from '@magiqan/reporter'

class XmlReporter extends HTTPReporter {
  constructor(myFile){
    super(/** file path */, myFile);
  }
  async onFileResult(result){
    await this.http.post('/result', JSON.stringify(result))
  }
}

Clone this wiki locally