forked from futurice/testtoys
-
Notifications
You must be signed in to change notification settings - Fork 0
AitoDotAI/testtoys
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
testtoys -------- texttoys is a test tool for text-based behavioral testing. It can be combined with JUnit for proper IDE integration. usage example: -------------- Let's examine following unittest example: import org.junit.*; import static org.junit.Assert.*; import java.io.IOException; public class ExampleTest { @Test public void testPlus() throws IOException { TestTool t = new TestTool("testio/example/plus"); t.tln("testing plus operation"); t.tln(" 1+1=" + (1+1)); assertTrue(t.done()); } } Running the test first time will create following output: running testio/example/plus... testing plus operation 1+1=2 2 ms. [d]iff, [c]ontinue or [f]reeze?f frozen. After freezing the behavior, the tool will create expectation file with following content testing plus operation 1+1=2 If for some reason the result changes (e.g. 1+1=3), the test will fail. The tool will show on the margin the expected result: running testio/example/plus... testing plus operation ! 1+1=3 | 1+1=2 1 ms. 1 errors! [d]iff, [c]ontinue or [f]reeze? If the test is run in interactive mode, the developer can mark the new result as ok by [f]reezing it. [d]iff lets user to see the difference between new and old results in Meld (if installed). To run non-interactive by default (can be overridden in code), define the environment variable TESTTOYS_NEVER_FREEZE. the benefits: ------------- * Enables rapid behavioral testing. The effort level of creating a unittest case is similar to printing debug info with System.out.println(); * The benefit compared to traditional unit testing are: 1. Greatly reduced effort and increased speed of creating tests * No precreated vectors containing right orders & results * No checking of each function result with custom comparison -> You get better test coverage faster and with less effort 2. Fast comparison to old results: * If you are measuring things without 'one right answer' like performance, error/quality rates or orders, you will immediately see, whether the new results are better than the old ones. -> you can test things for which conventional unit tests would be clumsy and ineffective. 3. Greatly reduced effort in maintaining the tests * No updating of result vectors or result objects Just select [f]reeze and you have new expected result. * This is HUGE deal, when developing software, which doesn't create single correct results, but where results improve with every iteration. When improving results little by little it would be major pair to update parts of the unittest code, whenever results change. -> you can maintain larger test sets cheaper 4. The tests are self-documenting and the tool create in essense 'formal documentation of the expected behavior' * The generated file can document itself by simply printing comments on the results. * The expectation files form a natural documentation of the system's expected behavior. If you have performance tests, the expected performance will be stored in the expectation files. If you have error rates or e.g. results of stemmers: the expected error rates and tokens are there too. these results are immediately available in human readable form without a need to run potentially slow tests (e.g. performance, scaling and stress tests may take a while). -> it will improve your awareness of the system's behavior and performance in the most convenient way. * While the tool is not perfect and the approach has its own inconveniences (e.g. links to relevant code lines are missing), my own experience with this kind of testing has been hugely positive. It is extremely convenient and productive way to do testing. It allows better coverage, and it helps building better quality and better behaving software faster. It is also very convenient and easy way to do testing. setup: ------ To install testtoys in your local repository, use: sbt publishLocal To use testtoys in your project, add following dependencies into your sbt project: libraryDependencies ++= Seq( "com.futurice" %% "testtoys" % "0.1-SNAPSHOT" % "test", "junit" % "junit" % "4.8" % "test", "com.novocode" % "junit-interface" % "0.11" % Test ) First line adds the testtoy. Second adds the needed junit library and the third line adds sbt junit integration so that you can run the tests with: sbt test To be able to see diff between old and new result, install meld: sudo apt install meld more on usage: -------------- The first time the ExampleTest is run, it will generate output in testio/example/plus_out.txt file. After you freeze the file it will be renamed as... testio/example/plus_exp.txt If test fails, both plus_out.txt and plus_exp.txt will remain so you can later compare the differences and try identify the cause of failure. If you create new files with the testtool, the files will be created in testio/example/plus_out/file1.txt kind of directory. This directory will be cleaned, when the test is ran again. After freezing the expectation files, you likely want to add testio/*/*_exp.txt files into your repository. Also you likely want make your clean script remove all testio/*/*_out.txt files and testio/*/*_out directories. Also you likely want to add *_out.txt and *_out files into your gitignore file. more information: ----------------- See the unit tests in src/test/java folder to see more examples of the the tool usage. acknowledgements: ----------------- Thanks for our customer for letting us (Futurice) publish this tool as it was originally developed for their project and legally their IPR. Thanks for Ferenc Dosa-Racz for showing the way and the benefits of this approach with his ITK (integrated testkit). This kind of testing is also available in texttest tool developed by Geoff Bache and Daniel Galdames in: http://texttest.sourceforge.net/ So this kind of testing approach is not exactly a new idea. This tool was created merely to provide similar kind of functionality in Java / JVM environment and to suit my individual tastes. the way forward: ---------------- testtoys is not 100% production complete. It is simple and it works, but e.g. shipping the expectation text files within a test jar file is not supported. Without doubt, it also missing useful functionality and it may have bugs. One nice thing would be better annotations / integrations with IDE so that you could entirely skip TestTool creation and assertTrue(t.done()) check so that you would have. @TestToy public void testPlus(TestTool t) throws IOException { t.tln("testing plus operation"); t.tln(" 1+1=" + (1+1)); } This would reduce typing and syntatic noise. It would be great to have dynamically sized test areas. This could be especially useful if you printing in test files things like log, which content can be partly ignored: We are going to do X. It needs to happen without errors. Starting test... log: { 10:20 Random thing happened 10:21 Location of this may change 10:23 X occurred 10:25 ERROR!!! 10:26 This line may appear in log, or not } found: { X occurred - ok ERROR!!! - failed } In this case the area between '{' and '}' would form a scope, which can have varying amount of lines.
About
testtoys
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published
Languages
- Scala 100.0%