diff --git a/api/controller/TestController.php b/api/controller/TestController.php
index ccf2ad7c14532aba5f7381d82fd70df091542845..1f60dada4d8af6cbf1ddcb7a9cdb0dc594ca156b 100644
--- a/api/controller/TestController.php
+++ b/api/controller/TestController.php
@@ -194,7 +194,7 @@ class TestController {
                 $passes = 1;
             } else {
                 $fails = 1;
-                $message = stack_string('default_test_fail');
+                $message = stack_string('defaulttestfail');
             }
         }
 
diff --git a/api/public/bulktest.php b/api/public/bulktest.php
index 08c1b84e63d8719113457a2b6f530bcd47a51348..a50e7f4b48bf7a62d756f09e6bf89844e5b3195e 100644
--- a/api/public/bulktest.php
+++ b/api/public/bulktest.php
@@ -160,7 +160,7 @@ require_login();
                     }
                   }
                   if (!json.istests && json.results[seed].passes == 1) {
-                    resultHtml += '<p class="feedback passed">' + '<?php echo stack_string('default_test_pass')?>' + '</p>';
+                    resultHtml += '<p class="feedback passed">' + '<?php echo stack_string('defaulttestpass')?>' + '</p>';
                   }
                   // Display seed level messages - will be exceptions.
                   if (json.results[seed].messages) {
diff --git a/lang/en/qtype_stack.php b/lang/en/qtype_stack.php
index 72816403c0d994da1cb6037c12ac04078193b4dd..072b01484a10fe381de5408786bfb6e65310549e 100644
--- a/lang/en/qtype_stack.php
+++ b/lang/en/qtype_stack.php
@@ -512,7 +512,8 @@ $string['testallincategory'] = 'Test all questions in this category';
 $string['overallresult'] = 'Overall result';
 $string['seedx'] = 'Seed {$a}';
 $string['testpassesandfails'] = '{$a->passes} passes and {$a->fails} failures.';
-
+$string['defaulttestpass'] = 'Default test using model answers returns a score of 1.';
+$string['defaulttestfail'] = 'Default test using model answers does not return a score of 1.';
 // Strings used by the question test script.
 $string['addanothertestcase'] = 'Add another test case...';
 $string['addatestcase'] = 'Add a test case...';
@@ -578,6 +579,8 @@ $string['runquestiontests_help'] = 'The dashboard runs question tests which unit
 $string['runquestiontests_alert'] = 'Question is missing tests or variants.';
 $string['runquestiontests_auto'] = 'Automatically adding one test case assuming the teacher\'s input gets full marks.  Please check the answer note carefully.';
 $string['runquestiontests_autoprompt'] = 'Add test case assuming the teacher\'s input gets full marks.';
+$string['runquestiontests_explanation'] = 'If you add the test, its output will look like this:';
+$string['runquestiontests_example'] = 'example';
 $string['autotestcase'] = 'Test case assuming the teacher\'s input gets full marks.';
 $string['showingundeployedvariant'] = 'Showing undeployed variant: {$a}';
 $string['switchtovariant'] = 'Switch to variant: ';
@@ -1527,8 +1530,6 @@ $string['castext_error_unevaluated'] = 'This text content was never evaluated.';
 
 
 
-$string['default_test_fail'] = 'Default test using the model answers does not return a score of 1.';
-$string['default_test_pass'] = 'Default test using the model answers returns a score of 1.';
 // API strings.
 $string['api_choose_file'] = 'Please select a question file';
 $string['api_choose_folder'] = 'Choose a STACK folder';
diff --git a/questiontestrun.php b/questiontestrun.php
index af54fcb8da9206355a3d2a307bc80c299d789faa..8f0259292e841db10db0faf6dc8dbfb94dc4e6ee 100644
--- a/questiontestrun.php
+++ b/questiontestrun.php
@@ -176,27 +176,12 @@ $questionvariablevalues = $question->get_question_session_keyval_representation(
 // Load the list of test cases.
 $testscases = question_bank::get_qtype('stack')->load_question_tests($question->id);
 // Create the default test case.
+$defaulttest = null;
+$defaulttestresult = null;
+
 if (optional_param('defaulttestcase', null, PARAM_INT) && $canedit) {
-    $inputs = [];
-    foreach ($question->inputs as $inputname => $input) {
-        $inputs[$inputname] = $input->get_teacher_answer_testcase();
-    }
-    $qtest = new stack_question_test(stack_string('autotestcase'), $inputs);
-    $response = stack_question_test::compute_response($question, $inputs);
-
-    foreach ($question->prts as $prtname => $prt) {
-        $result = $question->get_prt_result($prtname, $response, false);
-        // For testing purposes we just take the last note.
-        $answernotes = $result->get_answernotes();
-        $answernote = [end($answernotes)];
-        // Here we hard-wire 1 mark and 0 penalty.  This is what we normally want for the
-        // teacher's answer.  If the question does not give full marks to the teacher's answer then
-        // the test case will fail, and the user can confirm the failing behaviour if they really intended this.
-        // Normally we'd want a failing test case with the teacher's answer not getting full marks!
-        $qtest->add_expected_result($prtname, new stack_potentialresponse_tree_state(
-            1, true, 1, 0, '', $answernote));
-    }
-    question_bank::get_qtype('stack')->save_question_test($questionid, $qtest);
+    $defaulttest = stack_bulk_tester::create_default_test($question);
+    question_bank::get_qtype('stack')->save_question_test($questionid, $defaulttest);
     $testscases = question_bank::get_qtype('stack')->load_question_tests($question->id);
 
     echo html_writer::tag('p', stack_string_error('runquestiontests_auto'));
@@ -217,6 +202,13 @@ if (empty($testscases) && $canedit) {
     echo html_writer::end_tag('form');
 }
 
+if (empty($testscases)) {
+    $defaulttest = stack_bulk_tester::create_default_test($question);
+    $defaulttestresult = $defaulttest->test_question($questionid, $seed, $context);
+    echo stack_string('runquestiontests_explanation');
+    echo $defaulttestresult->html_output($question, stack_string('runquestiontests_example'));
+}
+
 $deployfeedback = optional_param('deployfeedback', null, PARAM_TEXT);
 if (!is_null($deployfeedback)) {
     echo html_writer::tag('p', $deployfeedback, ['class' => 'overallresult pass']);
diff --git a/stack/bulktester.class.php b/stack/bulktester.class.php
index 8dae8fd8313b63a108aec839387bb210a5da48c6..b9152c5e84f1ac2d7834fd722230afcf0cf45516 100644
--- a/stack/bulktester.class.php
+++ b/stack/bulktester.class.php
@@ -450,6 +450,18 @@ class stack_bulk_tester {
             return [false, "Attempting to start the question threw an exception!"];
         }
 
+        if (!$tests) {
+            $defaulttest = stack_bulk_tester::create_default_test($question);
+            $defaulttestresult = $defaulttest->test_question($qid, $seed, $context);
+            if ($defaulttestresult->passed()) {
+                $ok = true;
+                $message = stack_string('defaulttestpass');
+            } else {
+                $ok = false;
+                $message = stack_string('defaulttestfail');
+            }
+        }
+
         // Prepare the display options.
         $options = new question_display_options();
         $options->readonly = true;
@@ -582,4 +594,41 @@ class stack_bulk_tester {
         echo html_writer::tag('p', html_writer::link(new moodle_url('/question/type/stack/adminui/bulktestindex.php'),
                 get_string('back')));
     }
+
+    /**
+     * Create a default test for a question.
+     *
+     * Expected score of 1 and penalty of 0 using the model answers.
+     * The answer note will be set to whatever answer note the model
+     * answer returns.
+     *
+     * Question usage by attempt needs to have already been set up
+     * and the question started.
+     *
+     * @param object $question
+     * @return stack_question_test
+     */
+    public static function create_default_test($question) {
+        $inputs = [];
+        foreach ($question->inputs as $inputname => $input) {
+            $inputs[$inputname] = $input->get_teacher_answer_testcase();
+        }
+        $qtest = new stack_question_test(stack_string('autotestcase'), $inputs);
+        $response = stack_question_test::compute_response($question, $inputs);
+
+        foreach ($question->prts as $prtname => $prt) {
+            $result = $question->get_prt_result($prtname, $response, false);
+            // For testing purposes we just take the last note.
+            $answernotes = $result->get_answernotes();
+            $answernote = [end($answernotes)];
+            // Here we hard-wire 1 mark and 0 penalty.  This is what we normally want for the
+            // teacher's answer.  If the question does not give full marks to the teacher's answer then
+            // the test case will fail, and the user can confirm the failing behaviour if they really intended this.
+            // Normally we'd want a failing test case with the teacher's answer not getting full marks!
+            $qtest->add_expected_result($prtname, new stack_potentialresponse_tree_state(
+                1, true, 1, 0, '', $answernote));
+        }
+
+        return $qtest;
+    }
 }
diff --git a/tests/api_controller_test.php b/tests/api_controller_test.php
index 348d76d05977c55e0ca7972fe12a22eae7f508fd..f1e95fee86f948b24a9ae8723da4fbad55ee234c 100644
--- a/tests/api_controller_test.php
+++ b/tests/api_controller_test.php
@@ -330,7 +330,7 @@ class api_controller_test extends qtype_stack_testcase {
         $this->assertEquals(false, $results->isdeployedseeds);
         $this->assertEquals(false, $results->israndomvariants);
         $this->assertEquals(false, $results->istests);
-        $this->assertEquals(stack_string('default_test_fail'), $results->results->noseed->messages);
+        $this->assertEquals(stack_string('defaulttestfail'), $results->results->noseed->messages);
         $this->assertEquals(1, $results->results->noseed->fails);
         $this->assertEquals(0, $results->results->noseed->passes);
     }