code: @Override
  	public void execute() {
  		// save archive dir of the outer module so it can be reset later
  		String previousArchiveDir = archiveDirProvider.get().getPath();
  
  		try {
  			// make sure archive dirs are within that of the container module
  			moduleArchiveDir = moduleArchiveDirProvider.get().getPath();
  			config.put(JFunkConstants.ARCHIVE_DIR, moduleArchiveDir);
  
  			for (ModuleWithCallbacks moduleWithCallbacks : modulesWithCallbacks) {
  				TestModule testModule = moduleWithCallbacks.testModule;
  
  				Runnable beforeModuleCallback = moduleWithCallbacks.beforeModuleCallback;
  				if (beforeModuleCallback != null) {
  					beforeModuleCallback.run();
  				}
  
  				scriptContext.run(testModule);
  
  				Runnable afterModuleCallback = moduleWithCallbacks.afterModuleCallback;
  				if (afterModuleCallback != null) {
  					afterModuleCallback.run();
  				}
  			}
  		} finally {
  			// reset for outer module, so property is correctly archived
  			config.put(JFunkConstants.ARCHIVE_DIR, previousArchiveDir);
  
  			// it does not make sense to archive datasets in the container module,
  			// these would be those of the test module executed last
  			config.put(JFunkConstants.ARCHIVE_DATASETS, "false");
  		}
  	}
docs: Executes the added test modules and their callbacks in the order of their addition using
  {@link ScriptContext#run(TestModule)}.