Testfest is a project mainly written in JAVASCRIPT and RACKET, based on the View license.
TestFest requires Racket 5.1.3 or higher:
http://racket-lang.org/download/
TestFest requires sendmail to send account notification messages to students.
We've used TestFest on a Debian/Xen virtual machine with 256 MB RAM. Running students' code usually requires more resources than running the Web service itself.
From the command-line, create a sample assignment:
$ cd src $ racket sample.rkt
If there are no errors, you'll see the following message:
Created sample database at testfest.db. Username and password are [email protected]
From the same directory, start the TestFest server:
$ racket server.rkt
Visit http://localhost:8080 and login with the credentials above.
Login as a TA, select the "ae" assignment, and then select "Test Suites" on the left. TAs can submit tests and solutions in exactly the same manner as students. Submit the following test:
(test (calc (parse '{+ 3 7})) 10)
As a TA, select "Pending Tests" and approve the test. You'll need to click Refresh to update the list.
Return to "Test Suites" and Refresh to see that the test is accepted.
Select "Solutions" and submit the following correct solution to the AE assignment:
(define-type AE [num (n integer?)] [add (lhs AE?) (rhs AE?)] [sub (lhs AE?) (rhs AE?)])
(define (parse sexp) (cond [(number? sexp) (num sexp)] [(and (list? sexp) (= 3 (length sexp))) (case (first sexp) [(+) (add (parse (second sexp)) (parse (third sexp)))] [(-) (sub (parse (second sexp)) (parse (third sexp)))] [else (error 'parse "unknown operator")])] [else (error 'parse "unknown term")]))
(define (calc an-ae) (type-case AE an-ae [num (n) n] [add (lhs rhs) (+ (calc lhs) (calc rhs))] [sub (lhs rhs) (- (calc lhs) (calc rhs))]))
Refresh a few times to see the solution pass the test suite.
After logging in, you'll see "ae" on the top-left toolbar. This is a sample assignment to write an interpreter for (A)rithmetic (E)xpressions. Click on "ae" to reveal the assignment toolbar.
The assignment toolbar has "Test Suites" and "Solutions" on the left; these are visible to students and TAs. The items on the right-hand side are only visible to TAs.
Students submit test suites from the "Test Suite" pane. Submitted tests run against the TA-written solution, which is visible to TAs under the "Solution" pane. If the test suite passes the TA-written solution, it appears under "Pending Tests". If the test suite signals an error, TAs are not notified. However, students frequently blame TAs for writing faulty solutions or specifications. Sometimes, the TA solution is faulty, so TestFest allows the solution to be changed and allows previously accepted to be rejected.
While the assignment is out, TAs must periodically check and accept/reject submitted tests under "Pending Tests". Once a test is accepted by the TA, it is added to a global pool of tests. Submitted solutions are tested against all tests in the pool.
You can invite new users from the command-line:
$ cd src $ racket users.rkt [email protected] [email protected]
This command uses email addresses as usernames, generates new passwords, and notifies users. A shorter variant:
$ racket users.rkt --suffix "@cs.brown.edu" arjun sk
The TestFest Web application allows TAs to create new PLAI and PLAI-GC based assignments. New kinds of assignment require some programming. You'll need to add a case for checking test suites:
https://github.com/brownplt/testfest/blob/master/src/background.rkt#L120
and for checking solutions:
https://github.com/brownplt/testfest/blob/master/src/background.rkt#L48
TestFest represents students' submissions as "solution" and "test-suite" records, both defined in types.rkt:
https://github.com/brownplt/testfest/blob/master/src/types.rkt#L41
For example, the run-test function sandboxes and runs a single test suite and solution:
https://github.com/brownplt/testfest/blob/master/src/background.rkt#L221
Run-test produces an s-expression that represents test results. This s-expression is printed to a string by result->string/port:
https://github.com/brownplt/testfest/blob/master/src/background.rkt#L13
The result is stored in the solution-status field of the solution:
https://github.com/brownplt/testfest/blob/master/src/background.rkt#L67
This result is displayed to students, so it must not print confidential information, such as other students' tests and solutions.