diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl
index 685744744a..eb9041d1f3 100644
--- a/src/bin/psql/t/001_basic.pl
+++ b/src/bin/psql/t/001_basic.pl
@@ -15,10 +15,46 @@ program_options_handling_ok('psql');
 my ($stdout, $stderr);
 my $result;
 
+# Execute a psql command and check its result patterns.
+sub psql_like
+{
+	local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+	my $node            = shift;
+	my $test_name       = shift;
+	my $query           = shift;
+	my $expected_stdout = shift;
+	my $expected_stderr = shift;
+
+	die "cannot specify both expected stdout and stderr here"
+	  if (defined($expected_stdout) && defined($expected_stderr));
+
+	# Use the context of a WAL sender, some of the tests rely on that.
+	my ($ret, $stdout, $stderr) = $node->psql(
+		'postgres', $query,
+		on_error_die => 0,
+		replication  => 'database');
+
+	if (defined($expected_stdout))
+	{
+		is($ret,    0,  "$test_name: expected result code");
+		is($stderr, '', "$test_name: no stderr");
+		like($stdout, $expected_stdout, "$test_name: stdout matches");
+	}
+	if (defined($expected_stderr))
+	{
+		isnt($ret, 0, "$test_name: expected result code");
+		like($stderr, $expected_stderr, "$test_name: stderr matches");
+	}
+
+	return;
+}
+
 # test --help=foo, analogous to program_help_ok()
 foreach my $arg (qw(commands variables))
 {
-	$result = IPC::Run::run [ 'psql', "--help=$arg" ], '>', \$stdout, '2>', \$stderr;
+	$result = IPC::Run::run [ 'psql', "--help=$arg" ], '>', \$stdout, '2>',
+	  \$stderr;
 	ok($result, "psql --help=$arg exit code 0");
 	isnt($stdout, '', "psql --help=$arg goes to stdout");
 	is($stderr, '', "psql --help=$arg nothing to stderr");
@@ -34,11 +70,13 @@ max_wal_senders = 4
 });
 $node->start;
 
-$node->command_like([ 'psql', '-c', '\copyright' ], qr/Copyright/, '\copyright');
-$node->command_like([ 'psql', '-c', '\help' ], qr/ALTER/, '\help without arguments');
-$node->command_like([ 'psql', '-c', '\help SELECT' ], qr/SELECT/, '\help');
-
+psql_like($node, '\copyright', '\copyright', qr/Copyright/, undef);
+psql_like($node, '\help without arguments', '\help', qr/ALTER/, undef);
+psql_like($node, '\help with argument', '\help SELECT', qr/SELECT/, undef);
 
 # Test clean handling of unsupported replication command responses
-$node->command_fails_like([ 'psql', '-d', 'replication=database', '-c', 'START_REPLICATION 0/0' ],
-	qr/^unexpected PQresultStatus: 8$/, 'handling of unexpected PQresultStatus');
+psql_like(
+	$node,
+	'handling of unexpected PQresultStatus',
+	'START_REPLICATION 0/0',
+	undef, qr/unexpected PQresultStatus: 8$/);
