KUnit is a simple unit testing framework for FANUC's KAREL programming language. KUnit provides useful assertions and test output feedback via the web browser.
KUnit v1.0.0 ........ Finished in 0.002 seconds 4000.0 tests/sec, 9500.0 assertions/sec 8 tests, 19 assertions, 0 failures - Download the latest release
- Copy the
kunit.pcandvendor/strings.pcfiles to your robot - Copy the
kunit.h.klto your project's support directory or the same directory as your KAREL test file %INCLUDE kunit.hin your test KAREL program- Use the KUnit assertions as described below
- Make sure to use
kunit_doneat the end of your test file - Translate and deploy your KAREL program to your robot
- Run the test suite at
http://your.robot/KAREL/kunit?filenames=your_test
The output is unformatted by default. Set output=html to get HTML formatting.
http://your.robot/KAREL/kunit?filenames=your_test&output=html You can run multiple test files in parallel by a comma-separated list of filenames to the test runner.
http://your.robot/KAREL/kunit?filenames=test_kunit,test_something_else Look at the src/test_kunit.kl file for a real-world example. (Note: the test_kunit.kl file is a bit hack-ish, but testing KUnit with KUnit? so meta...)
Here's a simple example of testing a routine that adds two INTEGERs together:
PROGRAM test_add_int -- %NOLOCKGROUP is required to run KAREL from browser %NOLOCKGROUP -- %INCLUDE the KUnit routines %INCLUDE kunit.h -- the ROUTINE under test ROUTINE add_int(l : INTEGER; r : INTEGER) : INTEGER BEGIN RETURN(l + r) END add_int -- one test ROUTINE test_11 : BOOLEAN BEGIN RETURN(kunit_eq_int(2, add_int(1,1))) END test_11 -- second test ROUTINE test_22 : BOOLEAN BEGIN RETURN(kunit_eq_int(4, add_int(2,2))) END test_22 -- one more test ROUTINE test_00 : BOOLEAN BEGIN RETURN(kunit_eq_int(0, add_int(0,0))) END test_00 BEGIN -- do some tests kunit_test('1+1=2', test_11) kunit_test('2+2=4', test_22) kunit_test('0+0=0', test_00) -- tell the test runner we are done kunit_done END test_add_int Since KAREL doesn't support blocks as arguments to functions or routines, I've found that it's best to simply create a new routine that returns a BOOLEAN result for each test since there's typically some setup, teardown, etc. For these contrived examples you could have simply used the KUnit assertion as the second argument to kunit_test:
kunit_test('1+1=2', kunit_eq_int(2, add_int(1,1))) kunit_assert(b : BOOLEAN) - Assert something is true
kunit_eq_int(expected : INTEGER; actual : INTEGER) - Assert two INTEGERs are equal
kunit_eq_r(expected : REAL; actual : REAL) - Assert two REALs are equal
kunit_eq_str(expected : STRING; actual : STRING) - Assert two STRINGs are equal
kunit_eq_pos(expected : XYZWPR; actual : XYZWPR - Assert two XYZWPR positions are equal.
kunit_eq_pip(fname : STRING) - Assert that the KUnit pipe is equal to the file located at the provided path (generally for use comparing STRINGs longer than 254 characters)
kunit_un_int(actual : INTEGER) - Assert an INTEGER is UNINIT.
kunit_un_str(actual : STRING) - Assert a STRING is UNINIT.
kunit_un_r(actual : REAL) - Assert a REAL is uninit.
All KUnit really does is provide a simple environment that stores information about the tests you perform. Tests are just any routine that returns a BOOLEAN value. If true, the test passes, otherwise the test fails. KUnit then prints out some useful information about how many tests you ran, how many failed, how many assertions you made, etc. If you use the provided KUnit assertions, you'll also get some helpful debug information about the test. For example, if you use the kunit_eq_str() routine, you might see something like this if it fails:
-- test routine: test('a eqls a', kunit_eq_str('a','b')) -- KUnit output: 1) Failure: a eqls a Expected "a" but got "b" You must have ROBOGUIDE installed and the the WinOLPC bin directory needs to be on your system $PATH.
- Download GnuWin if you don't already have it
- Clone the repository
- Run
maketo build the KAREL binary PC files - Copy the binaries to your ROBOGUIDE or real robot
- Run the tests from
http://robot.ip/KAREL/test_kunit
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request