1. A method comprising, by one or more computing devices: accessing a software module, wherein: the software module comprises: one or more input variables; one or more intermediate variables, wherein a value of each one of the intermediate variables directly or indirectly depends on at least one value of at least one of the input variables; and one or more conditional branching points, wherein each one of the conditional branching points has a branching condition specified by at least one of the input or intermediate variables, and whether the branching condition is satisfied depend on at least one value of the at least one of the input or intermediate variables; and during execution of the software module, at each one of the conditional branching points, the software module proceeds down different paths depending on whether the branching condition of the conditional branching point is satisfied; constructing one or more sets of variables corresponding to the input variables, wherein each one of the sets of variables comprises one of the input variables and the intermediate variables whose values directly or indirectly depend on the value of the one of the input variables; for each one of the sets of variables, computing an average branching depth that is affected by the input and intermediate variables of the set of variables; selecting a first one of the sets of variables that has the smallest average branching depth; assigning a first symbolic value to the input variable of the first one of the sets of variables; symbolically executing the software module, with the input variable of the first one of the sets of variables having the first symbolic value, to generate a first set of test cases for the input and intermediate variables of the first set of variables; and validating the software module using the first set of test cases.