A method, performed by one or more processors, the method comprising: providing (9.1) and displaying, in a live code sub-portion of a user interface, executable code representing a plurality of data processing elements of an executable data transformer, one or more of the data processing elements being configured to receive one or more datasets and to produce one or more transformed datasets; receiving insertion of a breakpoint by means of placement of a breakpoint graphic adjacent a line of said code; executing (9.2) a sub-portion of the executable code up to the inserted breakpoint and displaying (9.3) in a first portion of a user interface a result of executing the sub-portion of the executable code up to the inserted breakpoint on one or more datasets; receiving (9.4) test code in a second portion of the user interface and executing (9.5) the test code, in isolation from the executable code, to apply a test transformation on the one or more datasets transformed by the sub-portion of the executable code up to the inserted breakpoint to generate and display in the first portion of the user interface an updated result of the test transformation on the one or more transformed datasets; and inserting (9.6) the test code received in the second portion into the executable code of the data transformer, responsive to user selection of an insertion button or icon associated with the second portion of the user interface, the test code being inserted directly after the breakpoint, wherein the live code sub-portion of the user interface is configured to prevent user modification of said provided code other than by means of insertion of the test code using the insertion button or icon. providing (9.1) and displaying, in a live code sub-portion of a user interface, executable code representing a plurality of data processing elements of an executable data transformer, one or more of the data processing elements being configured to receive one or more datasets and to produce one or more transformed datasets; receiving insertion of a breakpoint by means of placement of a breakpoint graphic adjacent a line of said code; executing (9.2) a sub-portion of the executable code up to the inserted breakpoint and displaying (9.3) in a first portion of a user interface a result of executing the sub-portion of the executable code up to the inserted breakpoint on one or more datasets; receiving (9.4) test code in a second portion of the user interface and executing (9.5) the test code, in isolation from the executable code, to apply a test transformation on the one or more datasets transformed by the sub-portion of the executable code up to the inserted breakpoint to generate and display in the first portion of the user interface an updated result of the test transformation on the one or more transformed datasets; and inserting (9.6) the test code received in the second portion into the executable code of the data transformer, responsive to user selection of an insertion button or icon associated with the second portion of the user interface, the test code being inserted directly after the breakpoint, wherein the live code sub-portion of the user interface is configured to prevent user modification of said provided code other than by means of insertion of the test code using the insertion button or icon.