Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nifty10m/yangyin
A snapshot testing library for spock test
https://github.com/nifty10m/yangyin
groovy snapshot-test snapshot-testing spock testing testing-tools
Last synced: 27 days ago
JSON representation
A snapshot testing library for spock test
- Host: GitHub
- URL: https://github.com/nifty10m/yangyin
- Owner: nifty10m
- License: mit
- Created: 2019-03-17T15:18:22.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2024-11-20T17:57:41.000Z (about 1 month ago)
- Last Synced: 2024-11-20T18:45:52.810Z (about 1 month ago)
- Topics: groovy, snapshot-test, snapshot-testing, spock, testing, testing-tools
- Language: Groovy
- Size: 238 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# YangYin
YangYin is an extension for [Spock](https://www.spockframework.org) to support snapshot testing. Snapshot testing means comparing current result of a test with a previously store result.
## The idea of snapshot testing
The main idea of snapshot testing is to create a _snapshot_ as soon as you know your code works as expected. After that the _snapshot_ is stored to a file and in every new run your test assures your code is still creating the same data as before.
## Release Notes
### 1.20 Update spock and change comparison
Failed comparisons are now handled as exceptions to get a better log message
Spock prefered version is now 1.3 to support JDK 11### 1.13 Fix a problem when excluding types in Json
Fixes a bug where types where not excluded although this feature was documented
### 1.11 Fix a problem when generating SNAPSHOTS
Fixes a bug when generating SNAPSHOT files with power assertion.
### 1.1 Removed all deprecated comparison
Dropped all deprecated Comparison implementations which are no longer maintained.
### 1.0.2 Added HtmlComparison
Introduced the first version of HtmlComparison to compare HTML code as text
### 1.0 Renamed to yangyin
Cause the usual transcription is yin and yang the project is now named yanyin.
### 0.92 Changed behaviour for SPOCK_UPDATE
The update behaviour of the system has changed. Now a Comparison is run before each update, only if comparisons fails a new file ist written to the file system. If
SPOCK_UPDATE is given as a parameter all obsolete files in the snaphot folders are removed from the filesystem.### 0.9 Changed default syntax for comparison
The original static method for Comparisons is no longer the default syntax. Use your own customizeable `Comparison` instances to compare current and snapshot.
A new ArrayComparison for comparing arrays of primitives was added.
### 0.8 Changed behaviour in continous integration server
### 0.7 Introduced image comparison by pixel
### 0.1 Initial release
## Basic Usage
Basic usage is done using the static `FileSnapshots` methods to create a snapshot from the latest api call and compare it with the the result stored in the file systems.
Each method requires a `Comparison` to indicate if objects are equals. There are several Comparison implementations inside yangyin but you can easily use your own implementation.
``` java
def result = classUnderTest.call(...)
FileSnapshots.current(result, new JsonComparison()) == FileSnapshots.snapshot(result, new JsonComparison())
```## Comparing using power assertion
You can use the power assert feature to reduce the code even further. Cause usually you want to use the same object and the same comparison for creating and retrieving your data. So you can reduce the code to:
``` java
def sample = classUnderTest.call(...)
FileSnapshots.assertSnapshot(sample, new JsonComparison())
```## Design Goals
YangYin was developed having the following goals in mind:
* Even for a testing library the code should be lightweighted without large dependencies. For basic usage the presence of spock, groovy and an up to date JDK should be enough.
* Readable code is prefered over performance optimization. Even if execution time might be optimized or snapshot storage could be more effizient readable code and readable error messages are prefered.
* Snapshot should be human readable. YangYin is designed to store snapshots using common file formats (i.e. .json or .png) so you can use your default system editor to inspect the snapshots.## Behaviour and updating
The default behaviour of the library is:
1. If there is an **existing snapshot**, read it and compare it with the latest version.
2. If there is **no snapshot** create a new file in the file systems and pass testThe behaviour in continous integration environment is a little bit different. If running in such an environment (most are detected by default) the test will fail if there is no snapshot in the file system. If your system is not recognized you can add an environment variable _CI_ to express you are running in an continous integration mode.
If you have changed the logic and want to **update** the persistent representation you can provide an environment variable `SPOCK_UPDATE="true"` to force yangyin to update all existing snapshot files.
## Build in comparisons
YangYin contains some build in comparisons:
### Binary Comparison
Object may be compared using BINARY comparison, in this comparison current and snapshot should be the same, meaning the `byte[]` implementation of snapshot und current must be equals.### Json Comparison
Comparison can be done using JSON. Meaning the object is stored as json and map representation (after deserializing) must be equals. Your object will be automaticly transformed into a json string, if it is not a string. Keep in mind default json handling is done via `groovy.json.JsonSlurper` so your object must be supported by this class.
``` java
FileSnapshots.assertSnapshot(sample, new JsonComparison()
```The `JsonComparison` has the following options:
* `String[] excludedProperties` A list of properties which should be excluded when comparing objects
* `String[] excludedTypes` A list of types which should be excluded when comparing objects
* `Map converter` A map of converters for given types### PNG Comparison
PNG compares the object as PNG files, treating images of same size (or optional with same pixels) as equal.
To compare image pixel by pixel you should use:
``` java
FileSnapshots.assertSnapshot(sample, new PngComparison(comparisonMode:PngComparison.PIXEL)
```
Keep in mind the test might run a while when comparing large images.The `PngComparison` has the following options:
* `MODE comparisonMode` Indicating that the image should be compared by SIZE (default) or by PIXEL. When comparing by pixel ensure you have enough memory to store the whole image in memory.### XML Comparison
XML compares the object as XML files, ignoring whitespace and order of attributes.### Text Comparison
TextComparison compares the object as plain text files, ignoring whitespace but checking all other stuff.
``` java
FileSnapshots.assertSnapshot(sample, new TextComparison())
```The `TextComparison` has the following options:
* `boolean ignoreCase` Treat results as equals even if they have different upper/lowercase spelling.
* `boolean ignoreWhitespace` Remove all white space when comparing text.### HTML Comparison
HtmlComparison compares the object using a HTML file. This is a simple text comparison using a filesuffix of html to represent the text as html in file system.
So no parsing is done and no checking of valid syntax### Array Comparison
ArrayComparison compares an one or two dimension arrya of primitives as CSV file,The `ArrayComparison` has the following options:
* `List ignoreValues` A list of all values which should be ignored for comparisons
* `String columnSeparator` The character which should be used as column separator in a csv file
* `int rounding` The number of decimal to keep when storing a float or double valueYou can use these implementations as examples for custom comparison by implementing the Comparison interface.
## Default file storage
The library assumes a default maven or gradle file structure. The snapshots are stored in the local file system in a `test/resources` subfolder called `${spec}/snapshots` where `$spec` is a lower case representation of your spec name. The filename is derived from the name of the feature and a postfix of `-1` if there is more than one snapshot test in your feature. There might be a future version where the file location is configureable.