An evaluation server for performing testing on source code, the evaluation server comprising a processing module configured to receive, from a user device (10, 110), a file comprising source code for performing a plurality of functions; wherein the file is an independent submission to the evaluation server; separate the source code into a plurality of source code components, wherein each source code component performs an individual function within the plurality of functions; resolve dependencies between the plurality of source code components until a stopping condition is met; identify when the source code component is dependent on any helper function by using a library to parse the relevant information from each source code component; wherein the helper function is a function that performs part of a computation of another function and is written by a user of the user device (10,110) or imported from other packages or other sources; and discard the helper function as a separate source code component so that the helper function is not individually tested during a software test but retain the helper function in a context of the individual function by including the code of the helper function in the code of the individual function; a testing module configured to test each source code component to generate a test result for each individual function; a hashing module configured to calculate a hash value for each individual function by hashing the source code component for the individual function; wherein to calculate the hash value for each individual function which calls on the helper function, the hashing module calculates the hash value using the helper function together with other elements of each individual function which calls on the helper function; and storage for storing a test result with an associated calculated hash value for each individual function; wherein at least the testing module and the hashing module are configured to test and calculate in parallel; and wherein the hash value of each individual function is used to identify whether the individual function has changed and testing of unchanged individual functions is avoided. a processing module configured to receive, from a user device (10, 110), a file comprising source code for performing a plurality of functions; wherein the file is an independent submission to the evaluation server; separate the source code into a plurality of source code components, wherein each source code component performs an individual function within the plurality of functions; resolve dependencies between the plurality of source code components until a stopping condition is met; identify when the source code component is dependent on any helper function by using a library to parse the relevant information from each source code component; wherein the helper function is a function that performs part of a computation of another function and is written by a user of the user device (10,110) or imported from other packages or other sources; and discard the helper function as a separate source code component so that the helper function is not individually tested during a software test but retain the helper function in a context of the individual function by including the code of the helper function in the code of the individual function; receive, from a user device (10, 110), a file comprising source code for performing a plurality of functions; wherein the file is an independent submission to the evaluation server; separate the source code into a plurality of source code components, wherein each source code component performs an individual function within the plurality of functions; resolve dependencies between the plurality of source code components until a stopping condition is met; identify when the source code component is dependent on any helper function by using a library to parse the relevant information from each source code component; wherein the helper function is a function that performs part of a computation of another function and is written by a user of the user device (10,110) or imported from other packages or other sources; and discard the helper function as a separate source code component so that the helper function is not individually tested during a software test but retain the helper function in a context of the individual function by including the code of the helper function in the code of the individual function; a testing module configured to test each source code component to generate a test result for each individual function; a hashing module configured to calculate a hash value for each individual function by hashing the source code component for the individual function; wherein to calculate the hash value for each individual function which calls on the helper function, the hashing module calculates the hash value using the helper function together with other elements of each individual function which calls on the helper function; and storage for storing a test result with an associated calculated hash value for each individual function; wherein at least the testing module and the hashing module are configured to test and calculate in parallel; and wherein the hash value of each individual function is used to identify whether the individual function has changed and testing of unchanged individual functions is avoided.