1. A computer-implemented method for automated testing of programs, the method comprising: accessing at least a portion of a program with an event-based interface; placing an arbitrary state in a set of test inputs; performing each of the following until at least one of i) a testing time allocated has expired, and ii) every test input in the set of test inputs has been executed: selecting at least one test input with an associated event handler from the set of test inputs; creating a set of branch points corresponding to the associate event handler, wherein each branch point is at least one of an entry to the associated event handler and a location in the program from which control flows in response to actions initiated outside the program; loading the test input to set a state of the program; executing the test input and the associated event handler to produce a resulting state; updating a set of results with the test input that was executed and a description of any errors encountered during execution of the test input; and based on the branch point being found in the set of branch points for the test input reducing a priority the test input in the set of test inputs, otherwise based on the resulting state being found in the set of results for the test input, updating the set of test inputs by at least one of: updating a parameter used in the test input; adding a new event in the event-based interface to be used with the test input; and updating the resulting state in the set of test inputs.