diff --git a/tools/run_tests/python_utils/bazel_report_helper.py b/tools/run_tests/python_utils/bazel_report_helper.py
index c62807a5856..12173aaf4e3 100755
--- a/tools/run_tests/python_utils/bazel_report_helper.py
+++ b/tools/run_tests/python_utils/bazel_report_helper.py
@@ -54,13 +54,11 @@ def _append_to_kokoro_bazel_invocations(invocation_id: str) -> None:
                   'a') as f:
             f.write(invocation_id + '\n')
         print(
-            'Added invocation ID %s to kokoro "bazel_invocation_ids" artifact' %
-            invocation_id,
+            f'Added invocation ID {invocation_id} to kokoro "bazel_invocation_ids" artifact',
             file=sys.stderr)
     else:
         print(
-            'Skipped adding invocation ID %s to kokoro "bazel_invocation_ids" artifact'
-            % invocation_id,
+            f'Skipped adding invocation ID {invocation_id} to kokoro "bazel_invocation_ids" artifact',
             file=sys.stderr)
         pass
 
@@ -68,7 +66,7 @@ def _append_to_kokoro_bazel_invocations(invocation_id: str) -> None:
 def _generate_junit_report_string(report_suite_name: str, invocation_id: str,
                                   success: bool) -> None:
     """Generate sponge_log.xml formatted report, that will make the bazel invocation reachable as a target in resultstore UI / sponge."""
-    bazel_invocation_url = 'https://source.cloud.google.com/results/invocations/%s' % invocation_id
+    bazel_invocation_url = f'https://source.cloud.google.com/results/invocations/{invocation_id}'
     package_name = report_suite_name
     # set testcase name to invocation URL. That way, the link will be displayed in some form
     # resultstore UI and sponge even in case the bazel invocation succeeds.
@@ -76,16 +74,15 @@ def _generate_junit_report_string(report_suite_name: str, invocation_id: str,
     if success:
         # unfortunately, neither resultstore UI nor sponge display the "system-err" output (or any other tags)
         # on a passing test case. But at least we tried.
-        test_output_tag = '<system-err>PASSED. See invocation results here: %s</system-err>' % bazel_invocation_url
+        test_output_tag = f'<system-err>PASSED. See invocation results here: {bazel_invocation_url}</system-err>'
     else:
         # The failure output will be displayes in both resultstore UI and sponge when clicking on the failing testcase.
-        test_output_tag = '<failure message="Failure">FAILED. See bazel invocation results here: %s</failure>' % bazel_invocation_url
+        test_output_tag = f'<failure message="Failure">FAILED. See bazel invocation results here: {bazel_invocation_url}</failure>'
 
     lines = [
         '<testsuites>',
-        '<testsuite id="1" name="%s" package="%s">' %
-        (report_suite_name, package_name),
-        '<testcase name="%s">' % testcase_name,
+        f'<testsuite id="1" name="{report_suite_name}" package="{package_name}">',
+        f'<testcase name="{testcase_name}">',
         test_output_tag,
         '</testcase>'
         '</testsuite>',
@@ -124,9 +121,9 @@ def _create_bazel_wrapper(report_path: str, report_suite_name: str,
     # Using an RC file solves problems with flag ordering in the wrapper.
     # (e.g. some flags need to come after the build/test command)
     with open(bazel_rc_filename, 'w') as f:
-        f.write('build --invocation_id="%s"\n' % invocation_id)
-        f.write('build --workspace_status_command="%s"\n' %
-                workspace_status_command)
+        f.write(f'build --invocation_id="{invocation_id}"\n')
+        f.write(
+            f'build --workspace_status_command="{workspace_status_command}"\n')
 
     # generate "failing" and "success" report
     # the "failing" is named as "sponge_log.xml", which is the name picked up by sponge/resultstore
@@ -150,16 +147,14 @@ def _create_bazel_wrapper(report_path: str, report_suite_name: str,
             '#!/bin/bash',
             'set -ex',
             '',
-            'tools/bazel --bazelrc="%s" "$@" || FAILED=true' %
-            bazel_rc_filename,
+            f'tools/bazel --bazelrc="{bazel_rc_filename}" "$@" || FAILED=true',
             '',
         ]
 
         if upload_results:
             upload_results_lines = [
-                'sleep %s' % _UPLOAD_RBE_RESULTS_DELAY_SECONDS,
-                'PYTHONHTTPSVERIFY=0 python3 ./tools/run_tests/python_utils/upload_rbe_results.py --invocation_id="%s"'
-                % invocation_id,
+                f'sleep {_UPLOAD_RBE_RESULTS_DELAY_SECONDS}',
+                f'PYTHONHTTPSVERIFY=0 python3 ./tools/run_tests/python_utils/upload_rbe_results.py --invocation_id="{invocation_id}"',
                 '',
             ]
         else:
@@ -171,8 +166,7 @@ def _create_bazel_wrapper(report_path: str, report_suite_name: str,
             '  exit 1',
             'else',
             '  # success: plant the pre-generated xml report that says "success"',
-            '  mv -f %s %s' %
-            (success_report_filename, failing_report_filename),
+            f'  mv -f {success_report_filename} {failing_report_filename}',
             'fi',
         ]
 
@@ -188,16 +182,15 @@ def _create_bazel_wrapper(report_path: str, report_suite_name: str,
         intro_lines = [
             '@echo on',
             '',
-            'bazel --bazelrc="%s" %%*' % bazel_rc_filename,
+            f'bazel --bazelrc="{bazel_rc_filename}" %*',
             'set BAZEL_EXITCODE=%errorlevel%',
             '',
         ]
 
         if upload_results:
             upload_results_lines = [
-                'sleep %s' % _UPLOAD_RBE_RESULTS_DELAY_SECONDS,
-                'python3 tools/run_tests/python_utils/upload_rbe_results.py --invocation_id="%s" || exit /b 1'
-                % invocation_id,
+                f'sleep {_UPLOAD_RBE_RESULTS_DELAY_SECONDS}',
+                f'python3 tools/run_tests/python_utils/upload_rbe_results.py --invocation_id="{invocation_id}" || exit /b 1'
                 '',
             ]
         else:
@@ -206,8 +199,7 @@ def _create_bazel_wrapper(report_path: str, report_suite_name: str,
         outro_lines = [
             'if %BAZEL_EXITCODE% == 0 (',
             '  @rem success: plant the pre-generated xml report that says "success"',
-            '  mv -f %s %s' %
-            (success_report_filename, failing_report_filename),
+            f'  mv -f {success_report_filename} {failing_report_filename}',
             ')',
             'exit /b %BAZEL_EXITCODE%',
         ]
@@ -218,13 +210,11 @@ def _create_bazel_wrapper(report_path: str, report_suite_name: str,
         ]
         f.writelines(lines)
 
-    print('Bazel invocation ID: %s' % invocation_id, file=sys.stderr)
-    print('Upload test results to BigQuery after bazel runs: %s' %
-          upload_results,
-          file=sys.stderr)
-    print('Generated bazel wrapper: %s' % bazel_wrapper_filename,
+    print(f'Bazel invocation ID: {invocation_id}', file=sys.stderr)
+    print(f'Upload test results to BigQuery after bazel runs: {upload_results}',
           file=sys.stderr)
-    print('Generated bazel wrapper: %s' % bazel_wrapper_bat_filename,
+    print(f'Generated bazel wrapper: {bazel_wrapper_filename}', file=sys.stderr)
+    print(f'Generated bazel wrapper: {bazel_wrapper_bat_filename}',
           file=sys.stderr)