/everytest

Flutter parametrized test package

Primary LanguageC++BSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

Every Test

Write and execute multiple combination of the same test with less code with every_test package.

Features

  • Write unit test with various parameter values

  • Write golden tests with various finders and parameters

Getting started

flutter pub add --dev every_test

Usage

Simple unit test

Start by calling everyTest method in any *_test.dart file

main() {
    everyTest(/***/);
}

Then give it a description

everyTest(
    'my first everyTest test',
    ...
);

Give it the test itself using parameter

...
'my first everyTest test',
of: (param) {
    final repository = SampleRepository();
    repository.values = param;
    return repository.average;
},
...    

Last but not least, give it the list of expected results depending on parameter using param(foo).gives(bar) syntax

...
of: (param) {
    ...
},
expects: [
    param([1, 2, 3]).gives(2),
],
...

Then add as many combination as wanted and voilĂ  !

everyTest(
    'Expected average values computation',
    of: (param) {
        final repository = SampleRepository();
        repository.values = param;
        return repository.average;
    },
    expects: [
        param([1, 2, 3]).gives(2),
        param([4, 5, 6]).gives(5),
        param([7, 8, 9]).gives(8),
        param([9, 9, 9]).gives(9),
    ],
);

Using several parameters a time

You may need to send multiple parameters for test execution. Just use Json syntax. That's it.

everyTest(
    'translation test',
    of: (params) {
      // GIVEN
      final locale = params['locale'];
      final key = params['key'];
      final repository = TranslationsRepository(currentLocale: locale);

      // WHEN
      return repository.translate(key);
    },
    expects: [
      // THEN
      param({'locale': 'en', 'key': 'app_name'}).gives('sample'), // en translation
      param({'locale': 'fr', 'key': 'app_name'}).gives('exemple'), // fr translation
      param({'locale': 'es', 'key': 'app_name'}).gives('sample'), // default translation
      param({'locale': 'en', 'key': 'hello'}).gives('!hello!'), // not found translation
    ],
  );

Golden tests

 everyTestGolden(
    'every test golden',
    of: (tester, color) async {
      await tester.pumpWidget(MyApp(primarySwatch: color));
    },
    expects: [
      finder(find.byType(MyApp)).matches(Colors.blue, 'goldens/blue.png'),
      finder(find.byType(MyApp)).matches(Colors.red, 'goldens/red.png'),
      finder(find.byType(MyApp)).matches(Colors.green, 'goldens/green.png'),
    ],
  );