1. A method comprising: by a dynamic symbolic execution engine comprising one or more processors: accessing software code to be automatically tested, the software code including multiple execution paths through multiple executable statements of the software code; and performing a dynamic phase of an automatic test of the software code by performing dynamic symbolic execution of a first portion of the execution paths, the dynamic symbolic execution forking a separate symbolic executor for each execution path in the first portion, each forked symbolic executor generating a corresponding formula for the corresponding execution path; by a static symbolic execution engine comprising one or more processors: determining that a second portion of the execution paths is devoid of non-statically interpretable executable statements; and performing a static phase of the automatic test of the software code by performing static symbolic execution of the second portion of the execution paths in response to the determining that the second portion is devoid of non-statically interpretable executable statements, the static symbolic execution generating at least one formula that corresponds to all executable statements in the second portion of the execution paths; and by a solver module comprising one or more processors, generating a set of test cases for the software code by solving the formulas generated during the dynamic and static phases of the automatic test of the software code.