Writing Testsuites
Pike includes a set of scripts to generate and run testsuites. While the primary purpose of these scripts is to test the Pike interpreter itself, you can easily use them to test your own code.This document describes the tools, as well as the syntax for writing tests. Testing toolsThe two tools that are included with Pike are called mktestsuite and test_pike.mktestsuiteThe mktestsuite script is a simple shell script that uses M4 to convert a testsuite input file into a testsuite that can be run by test_pike.pike. This script is found in $PIKE/include/pike.Usage:mktestsuite testsuite.in > testsuite pike test_pike testuitefile Writing testsuitesThe easiest way to generate a testsuite that can be run by test_pike is to use the mktestsuite script. mktestsuite uses M4 to perform macro substitution on your input test file. By using this preprocessor, you have access to a number of test types, which are listed below.The format of a testsuite that uses this approach simply consists of a set of tests, listed in the order they are to be run.A Simple Example:test_true(1) test_false(0) // this next test will fail test_false(-1) /usr/local/pike/7.6.50/include/pike/mktestsuite tests.in > tests /usr/local/pike/7.6.50/include/pike/test_pike.pike tests Doing tests in tests (3 tests) tests.in:4: Test 3 (shift 0) (CRNL) failed. 1: mixed a() { return -1; } 2:o->a(): -1Failed tests: 1. Total tests: 3 (0 tests skipped) Available test typesIn general, there are two forms of each type of test; one takes as its argument a set of statements that when run, will be placed within a function body and run. The other, denoted with a _any suffix, accepts as its argument(s) any block of Pike code, such as class definitions and multiple function definitions.test_anyUsage:test_any([[a]], b) test_any([[ int f (int i) {i = 0; return i;}; return f (1); ]],0) test_any_equal([[a]], b) test_any_equal([[ class Foo {int foo();}; return indices(Foo()); ]], ({"foo"})) test_eq(a, b) test_eq('u117f', 0x117f) test_equal(a, b) test_equal(mtest_m,copy_value(mtest_m)) test_do(a) test_do([[ void foo (int i) { multiset res = (<>); if (i) res = res; }; foo (1); ]]) test_true(a) test_true("A" == upper_case("a")) test_false(a) test_false("A" == "a") test_compile([[a]]) test_compile([[ Stdio.File foo=Stdio.File(); ]]) test_compile_any([[a]]) test_compile_any([[ void foo() { Stdio.File bar(int x, int y) { return 0; }; } ]]) test_compile_error([[a]]) test_compile_error([[ string a="x"; int b; b="x"*17; ]]) test_compile_error_any([[a]]) test_compile_error_any([[ mixed foo; mapping query_variables() { return ([]); }; mixed foo(mixed bar) { return 1/foo; } ]]) test_compile_warning([[a]]) test_compile_warning([[ int *a ]]) test_compile_warning_any([[a]]) test_compile_warning_any([[ #pragma strict_typesclass foo(string|int a) { void bar() { int b = a; } }object a = foo(1);]]) test_eval_error([[a]]) test_eval_error([[ class Z { int destroy() { return 1/y; } }(); ]]) test_define_program(a, [[b]]) test_define_program(bar,[[ int a(){ return 1; } ]]) test_program([[a]]) // we use the program "bar", which was defined //previously through the use of test_define_program test_program([[ inherit bar; ]]) test_program_eq([[a]], b) test_program_eq([[ constant x = X; class X {constant c = "right";} constant y = Y; class Y {constant c = "wrong";} string a() { return ::`[]("x")->c; } ]], "right") test_program_equal([[a]], b) test_program_eq([[ constant x = X; class X {constant c = ({"right"});} constant y = Y; class Y {constant c = ({"wrong"});} string a() { return ::`[]("x")->c; } ]], ({"right"})) test_tests([[a]]) test_do(a) Other resources- Pike Test Suite, from the Pike Reference ManualPowered by PikeWiki2 |
|||
gotpike.org | Copyright © 2004 - 2009 | Pike is a trademark of Department of Computer and Information Science, Linköping University |