diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index df9aae7436fc454214583f992da2d6465e512dc6..ce8e4d2a109762ac28c70135bfdd4200debda87f 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -1365,25 +1365,42 @@ TEST_P(SecureEnd2endTest, ClientAuthContext) {
   EXPECT_EQ("*.test.youtube.com", ToString(auth_ctx->GetPeerIdentity()[2]));
 }
 
-INSTANTIATE_TEST_CASE_P(
-    End2end, End2endTest,
-    ::testing::Values(TestScenario(false, kInsecureCredentialsType),
-                      TestScenario(false, kTlsCredentialsType)));
-
-INSTANTIATE_TEST_CASE_P(
-    End2endServerTryCancel, End2endServerTryCancelTest,
-    ::testing::Values(TestScenario(false, kInsecureCredentialsType)));
-
-INSTANTIATE_TEST_CASE_P(
-    ProxyEnd2end, ProxyEnd2endTest,
-    ::testing::Values(TestScenario(false, kInsecureCredentialsType),
-                      TestScenario(false, kTlsCredentialsType),
-                      TestScenario(true, kInsecureCredentialsType),
-                      TestScenario(true, kTlsCredentialsType)));
+std::vector<TestScenario> CreateTestScenarios(bool use_proxy,
+                                              bool test_insecure,
+                                              bool test_secure) {
+  std::vector<TestScenario> scenarios;
+  std::vector<grpc::string> credentials_types;
+  if (test_secure) {
+    credentials_types = GetSecureCredentialsTypeList();
+  }
+  if (test_insecure) {
+    credentials_types.push_back(kInsecureCredentialsType);
+  }
+  for (auto it = credentials_types.begin(); it != credentials_types.end();
+       ++it) {
+    scenarios.push_back(TestScenario(false, *it));
+    if (use_proxy) {
+      scenarios.push_back(TestScenario(true, *it));
+    }
+  }
+  return scenarios;
+}
+
+INSTANTIATE_TEST_CASE_P(End2end, End2endTest,
+                        ::testing::ValuesIn(CreateTestScenarios(false, true,
+                                                                true)));
+
+INSTANTIATE_TEST_CASE_P(End2endServerTryCancel, End2endServerTryCancelTest,
+                        ::testing::ValuesIn(CreateTestScenarios(false, true,
+                                                                false)));
+
+INSTANTIATE_TEST_CASE_P(ProxyEnd2end, ProxyEnd2endTest,
+                        ::testing::ValuesIn(CreateTestScenarios(true, true,
+                                                                true)));
 
 INSTANTIATE_TEST_CASE_P(SecureEnd2end, SecureEnd2endTest,
-                        ::testing::Values(TestScenario(false,
-                                                       kTlsCredentialsType)));
+                        ::testing::ValuesIn(CreateTestScenarios(false, false,
+                                                                true)));
 
 }  // namespace
 }  // namespace testing
diff --git a/test/cpp/util/test_credentials_provider.cc b/test/cpp/util/test_credentials_provider.cc
index f8380cdb65a47bf2ded0c2f41a88537fd62e7208..69651700feb8429a024e29075bbadadee82845cf 100644
--- a/test/cpp/util/test_credentials_provider.cc
+++ b/test/cpp/util/test_credentials_provider.cc
@@ -70,5 +70,11 @@ std::shared_ptr<ServerCredentials> GetServerCredentials(
   return nullptr;
 }
 
+std::vector<grpc::string> GetSecureCredentialsTypeList() {
+  std::vector<grpc::string> types;
+  types.push_back(kTlsCredentialsType);
+  return types;
+}
+
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/util/test_credentials_provider.h b/test/cpp/util/test_credentials_provider.h
index 4f25e3be66d30bb9248686991a8e6b99e3f9eaae..f4105d94b830ff4ff2f2373d04cefd1137240bb3 100644
--- a/test/cpp/util/test_credentials_provider.h
+++ b/test/cpp/util/test_credentials_provider.h
@@ -55,6 +55,9 @@ std::shared_ptr<ChannelCredentials> GetChannelCredentials(
 std::shared_ptr<ServerCredentials> GetServerCredentials(
     const grpc::string& type);
 
+// Provide a list of secure credentials type.
+std::vector<grpc::string> GetSecureCredentialsTypeList();
+
 }  // namespace testing
 }  // namespace grpc