Repository: kyverno/chainsaw
Pull request #371 (2023-11-03 22:16:21)

refactor: single file ref in operation
Single file ref in operation.

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/kyverno/chainsaw/pull/371?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) Report
> Merging [#371](https://app.codecov.io/gh/kyverno/chainsaw/pull/371?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) (a43223e) into [main](https://app.codecov.io/gh/kyverno/chainsaw/commit/52c47404cd14b605aafe12c33527680eb0d3bee4?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) (52c4740) will **decrease** coverage by `0.12%`.
> The diff coverage is `84.21%`.

```diff
@@            Coverage Diff             @@
##             main     #371      +/-   ##
==========================================
- Coverage   73.39%   73.28%   -0.12%     
==========================================
  Files          49       49              
  Lines        1669     1662       -7     
==========================================
- Hits         1225     1218       -7     
  Misses        397      397              
  Partials       47       47              
```


| [Files](https://app.codecov.io/gh/kyverno/chainsaw/pull/371?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno) | Coverage Δ | |
|---|---|---|
| [pkg/discovery/load.go](https://app.codecov.io/gh/kyverno/chainsaw/pull/371?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno#diff-cGtnL2Rpc2NvdmVyeS9sb2FkLmdv) | `87.30% <100.00%> (-0.58%)` | :arrow_down: |
| [pkg/commands/kuttl/migrate/command.go](https://app.codecov.io/gh/kyverno/chainsaw/pull/371?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=kyverno#diff-cGtnL2NvbW1hbmRzL2t1dHRsL21pZ3JhdGUvY29tbWFuZC5nbw==) | `69.88% <76.92%> (-0.18%)` | :arrow_down: |

:mega: Codecov offers a browser extension for seamless coverage viewing on GitHub. Try it in [Chrome](https://chrome.google.com/webstore/detail/codecov/gedikamndpbemklijjkncpnolildpbgo) or [Firefox](https://addons.mozilla.org/en-US/firefox/addon/codecov/) today!


Patch:
diff --git a/pkg/apis/v1alpha1/operation.go b/pkg/apis/v1alpha1/operation.go
index 40f662ed..db9d58f5 100644
--- a/pkg/apis/v1alpha1/operation.go
+++ b/pkg/apis/v1alpha1/operation.go
@@ -1,31 +1,29 @@
 package v1alpha1
 
 type Operation struct {
-	// Assert represents the assertions to be made for this test step. It checks whether the conditions
-	// specified in each assertion hold true.
+	// Assert represents an assertion to be made. It checks whether the conditions specified in the assertion hold true.
 	// +optional
-	Assert []Assert `json:"assert,omitempty"`
+	Assert *Assert `json:"assert,omitempty"`
 
-	// Apply lists the resources that should be applied for this test step. This can include things
+	// Apply represents resources that should be applied for this test step. This can include things
 	// like configuration settings or any other resources that need to be available during the test.
 	// +optional
-	Apply []Apply `json:"apply,omitempty"`
+	Apply *Apply `json:"apply,omitempty"`
 
 	// Create represents a creation operation.
 	// +optional
 	Create *Create `json:"create,omitempty"`
 
-	// Error lists the expected errors for this test step. If any of these errors occur, the test
+	// Error represents the expected errors for this test step. If any of these errors occur, the test
 	// will consider them as expected; otherwise, they will be treated as test failures.
 	// +optional
-	Error []Error `json:"error,omitempty"`
+	Error *Error `json:"error,omitempty"`
 
-	// Delete provides a list of objects that should be deleted before this test step is executed.
-	// This helps in ensuring that the environment is set up correctly before the test step runs.
+	// Delete represents a creation operation.
 	// +optional
-	Delete []Delete `json:"delete,omitempty"`
+	Delete *Delete `json:"delete,omitempty"`
 
-	// Exec provides a list of commands and/or scripts that should be executed as a part of this test step.
+	// Exec provides a command or script that should be executed as a part of this test step.
 	// +optional
-	Exec []ExecOperation `json:"exec,omitempty"`
+	Exec *ExecOperation `json:"exec,omitempty"`
 }
diff --git a/pkg/apis/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/v1alpha1/zz_generated.deepcopy.go
index 8eda6817..5ce3a626 100644
--- a/pkg/apis/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/v1alpha1/zz_generated.deepcopy.go
@@ -459,17 +459,13 @@ func (in *Operation) DeepCopyInto(out *Operation) {
 	*out = *in
 	if in.Assert != nil {
 		in, out := &in.Assert, &out.Assert
-		*out = make([]Assert, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
+		*out = new(Assert)
+		(*in).DeepCopyInto(*out)
 	}
 	if in.Apply != nil {
 		in, out := &in.Apply, &out.Apply
-		*out = make([]Apply, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
+		*out = new(Apply)
+		(*in).DeepCopyInto(*out)
 	}
 	if in.Create != nil {
 		in, out := &in.Create, &out.Create
@@ -478,24 +474,18 @@ func (in *Operation) DeepCopyInto(out *Operation) {
 	}
 	if in.Error != nil {
 		in, out := &in.Error, &out.Error
-		*out = make([]Error, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
+		*out = new(Error)
+		(*in).DeepCopyInto(*out)
 	}
 	if in.Delete != nil {
 		in, out := &in.Delete, &out.Delete
-		*out = make([]Delete, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
+		*out = new(Delete)
+		(*in).DeepCopyInto(*out)
 	}
 	if in.Exec != nil {
 		in, out := &in.Exec, &out.Exec
-		*out = make([]ExecOperation, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
+		*out = new(ExecOperation)
+		(*in).DeepCopyInto(*out)
 	}
 	return
 }
diff --git a/pkg/commands/kuttl/migrate/command.go b/pkg/commands/kuttl/migrate/command.go
index a83593de..966b0e2b 100644
--- a/pkg/commands/kuttl/migrate/command.go
+++ b/pkg/commands/kuttl/migrate/command.go
@@ -192,30 +192,30 @@ func testStep(in unstructured.Unstructured) (*v1alpha1.TestStep, error) {
 		},
 		ObjectMeta: from.ObjectMeta,
 	}
-
-	singleOperation := v1alpha1.Operation{}
 	for _, operation := range from.Apply {
-		singleOperation.Apply = append(singleOperation.Apply, v1alpha1.Apply{FileRef: v1alpha1.FileRef{File: operation}})
+		to.Spec.Try = append(to.Spec.Try, v1alpha1.Operation{Apply: &v1alpha1.Apply{FileRef: v1alpha1.FileRef{File: operation}}})
 	}
 	for _, operation := range from.Assert {
-		singleOperation.Assert = append(singleOperation.Assert, v1alpha1.Assert{FileRef: v1alpha1.FileRef{File: operation}})
+		to.Spec.Try = append(to.Spec.Try, v1alpha1.Operation{Assert: &v1alpha1.Assert{FileRef: v1alpha1.FileRef{File: operation}}})
 	}
 	for _, operation := range from.Error {
-		singleOperation.Error = append(singleOperation.Error, v1alpha1.Error{FileRef: v1alpha1.FileRef{File: operation}})
+		to.Spec.Try = append(to.Spec.Try, v1alpha1.Operation{Error: &v1alpha1.Error{FileRef: v1alpha1.FileRef{File: operation}}})
 	}
 	for _, operation := range from.Delete {
-		singleOperation.Delete = append(singleOperation.Delete, v1alpha1.Delete{
-			ObjectReference: v1alpha1.ObjectReference{
-				APIVersion: operation.APIVersion,
-				Kind:       operation.Kind,
-				ObjectSelector: v1alpha1.ObjectSelector{
-					Namespace: operation.Namespace,
-					Name:      operation.Name,
-					Labels:    operation.Labels,
+		to.Spec.Try = append(to.Spec.Try, v1alpha1.Operation{
+			Delete: &v1alpha1.Delete{
+				ObjectReference: v1alpha1.ObjectReference{
+					APIVersion: operation.APIVersion,
+					Kind:       operation.Kind,
+					ObjectSelector: v1alpha1.ObjectSelector{
+						Namespace: operation.Namespace,
+						Name:      operation.Name,
+						Labels:    operation.Labels,
+					},
 				},
 			},
 		})
 	}
-	to.Spec.Try = append(to.Spec.Try, singleOperation)
+	// TODO: commands
 	return to, nil
 }
diff --git a/pkg/discovery/load.go b/pkg/discovery/load.go
index 811e29a2..5409fcc6 100644
--- a/pkg/discovery/load.go
+++ b/pkg/discovery/load.go
@@ -118,26 +118,20 @@ func LoadTest(fileName string, path string) (*Test, error) {
 				switch groups[2] {
 				case "assert":
 					step.Spec.Try = append(step.Spec.Try, v1alpha1.Operation{
-						Assert: []v1alpha1.Assert{
-							{
-								FileRef: fileRef,
-							},
+						Assert: &v1alpha1.Assert{
+							FileRef: fileRef,
 						},
 					})
 				case "error":
 					step.Spec.Try = append(step.Spec.Try, v1alpha1.Operation{
-						Error: []v1alpha1.Error{
-							{
-								FileRef: fileRef,
-							},
+						Error: &v1alpha1.Error{
+							FileRef: fileRef,
 						},
 					})
 				default:
 					step.Spec.Try = append(step.Spec.Try, v1alpha1.Operation{
-						Apply: []v1alpha1.Apply{
-							{
-								FileRef: fileRef,
-							},
+						Apply: &v1alpha1.Apply{
+							FileRef: fileRef,
 						},
 					})
 				}
diff --git a/pkg/runner/processors/operation.go b/pkg/runner/processors/operation.go
index c2ce507b..bb60412a 100644
--- a/pkg/runner/processors/operation.go
+++ b/pkg/runner/processors/operation.go
@@ -48,25 +48,21 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 	t := testing.FromContext(ctx)
 	// Handle Delete
 	if operation.Delete != nil {
-		for _, operation := range operation.Delete {
-			var resource unstructured.Unstructured
-			resource.SetAPIVersion(operation.APIVersion)
-			resource.SetKind(operation.Kind)
-			resource.SetName(operation.Name)
-			resource.SetNamespace(operation.Namespace)
-			resource.SetLabels(operation.Labels)
-			if err := p.client.Delete(ctx, operation.Timeout, &resource); err != nil {
-				fail(t, operation.ContinueOnError)
-			}
+		var resource unstructured.Unstructured
+		resource.SetAPIVersion(operation.Delete.APIVersion)
+		resource.SetKind(operation.Delete.Kind)
+		resource.SetName(operation.Delete.Name)
+		resource.SetNamespace(operation.Delete.Namespace)
+		resource.SetLabels(operation.Delete.Labels)
+		if err := p.client.Delete(ctx, operation.Delete.Timeout, &resource); err != nil {
+			fail(t, operation.Delete.ContinueOnError)
 		}
 	}
 
 	// Handle Exec
 	if operation.Exec != nil {
-		for _, operation := range operation.Exec {
-			if err := p.client.Exec(ctx, operation.Exec, !operation.SkipLogOutput, namespace); err != nil {
-				fail(t, operation.ContinueOnError)
-			}
+		if err := p.client.Exec(ctx, operation.Exec.Exec, !operation.Exec.SkipLogOutput, namespace); err != nil {
+			fail(t, operation.Exec.ContinueOnError)
 		}
 	}
 
@@ -82,18 +78,16 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 	}
 	// Handle Apply
 	if operation.Apply != nil {
-		for _, operation := range operation.Apply {
-			resources, err := resource.Load(filepath.Join(test.BasePath, operation.File))
-			if err != nil {
-				logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
-				fail(t, operation.ContinueOnError)
-			}
-			shouldFail := operation.ShouldFail != nil && *operation.ShouldFail
-			for i := range resources {
-				resource := &resources[i]
-				if err := p.client.Apply(ctx, operation.Timeout, resource, shouldFail, cleaner); err != nil {
-					fail(t, operation.ContinueOnError)
-				}
+		resources, err := resource.Load(filepath.Join(test.BasePath, operation.Apply.File))
+		if err != nil {
+			logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
+			fail(t, operation.Apply.ContinueOnError)
+		}
+		shouldFail := operation.Apply.ShouldFail != nil && *operation.Apply.ShouldFail
+		for i := range resources {
+			resource := &resources[i]
+			if err := p.client.Apply(ctx, operation.Apply.Timeout, resource, shouldFail, cleaner); err != nil {
+				fail(t, operation.Apply.ContinueOnError)
 			}
 		}
 	}
@@ -116,32 +110,28 @@ func (p *operationProcessor) Run(ctx context.Context, namespace string, test dis
 
 	// Handle Assert
 	if operation.Assert != nil {
-		for _, operation := range operation.Assert {
-			resources, err := resource.Load(filepath.Join(test.BasePath, operation.File))
-			if err != nil {
-				logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
-				fail(t, operation.ContinueOnError)
-			}
-			for _, resource := range resources {
-				if err := p.client.Assert(ctx, operation.Timeout, resource); err != nil {
-					fail(t, operation.ContinueOnError)
-				}
+		resources, err := resource.Load(filepath.Join(test.BasePath, operation.Assert.File))
+		if err != nil {
+			logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
+			fail(t, operation.Assert.ContinueOnError)
+		}
+		for _, resource := range resources {
+			if err := p.client.Assert(ctx, operation.Assert.Timeout, resource); err != nil {
+				fail(t, operation.Assert.ContinueOnError)
 			}
 		}
 	}
 
 	// Handle Error
 	if operation.Error != nil {
-		for _, operation := range operation.Error {
-			resources, err := resource.Load(filepath.Join(test.BasePath, operation.File))
-			if err != nil {
-				logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
-				fail(t, operation.ContinueOnError)
-			}
-			for _, resource := range resources {
-				if err := p.client.Error(ctx, operation.Timeout, resource); err != nil {
-					fail(t, operation.ContinueOnError)
-				}
+		resources, err := resource.Load(filepath.Join(test.BasePath, operation.Error.File))
+		if err != nil {
+			logging.FromContext(ctx).Log("LOAD  ", color.BoldRed, err)
+			fail(t, operation.Error.ContinueOnError)
+		}
+		for _, resource := range resources {
+			if err := p.client.Error(ctx, operation.Error.Timeout, resource); err != nil {
+				fail(t, operation.Error.ContinueOnError)
 			}
 		}
 	}
diff --git a/website/docs/apis/chainsaw.v1alpha1.md b/website/docs/apis/chainsaw.v1alpha1.md
index f3abd410..e5a32789 100644
--- a/website/docs/apis/chainsaw.v1alpha1.md
+++ b/website/docs/apis/chainsaw.v1alpha1.md
@@ -317,12 +317,12 @@ For multiple objects use labels.</p>
 
 | Field | Type | Required | Inline | Description |
 |---|---|---|---|---|
-| `assert` | [`[]Assert`](#chainsaw-kyverno-io-v1alpha1-Assert) |  |  | <p>Assert represents the assertions to be made for this test step. It checks whether the conditions specified in each assertion hold true.</p> |
-| `apply` | [`[]Apply`](#chainsaw-kyverno-io-v1alpha1-Apply) |  |  | <p>Apply lists the resources that should be applied for this test step. This can include things like configuration settings or any other resources that need to be available during the test.</p> |
+| `assert` | [`Assert`](#chainsaw-kyverno-io-v1alpha1-Assert) |  |  | <p>Assert represents an assertion to be made. It checks whether the conditions specified in the assertion hold true.</p> |
+| `apply` | [`Apply`](#chainsaw-kyverno-io-v1alpha1-Apply) |  |  | <p>Apply represents resources that should be applied for this test step. This can include things like configuration settings or any other resources that need to be available during the test.</p> |
 | `create` | [`Create`](#chainsaw-kyverno-io-v1alpha1-Create) |  |  | <p>Create represents a creation operation.</p> |
-| `error` | [`[]Error`](#chainsaw-kyverno-io-v1alpha1-Error) |  |  | <p>Error lists the expected errors for this test step. If any of these errors occur, the test will consider them as expected; otherwise, they will be treated as test failures.</p> |
-| `delete` | [`[]Delete`](#chainsaw-kyverno-io-v1alpha1-Delete) |  |  | <p>Delete provides a list of objects that should be deleted before this test step is executed. This helps in ensuring that the environment is set up correctly before the test step runs.</p> |
-| `exec` | [`[]ExecOperation`](#chainsaw-kyverno-io-v1alpha1-ExecOperation) |  |  | <p>Exec provides a list of commands and/or scripts that should be executed as a part of this test step.</p> |
+| `error` | [`Error`](#chainsaw-kyverno-io-v1alpha1-Error) |  |  | <p>Error represents the expected errors for this test step. If any of these errors occur, the test will consider them as expected; otherwise, they will be treated as test failures.</p> |
+| `delete` | [`Delete`](#chainsaw-kyverno-io-v1alpha1-Delete) |  |  | <p>Delete represents a creation operation.</p> |
+| `exec` | [`ExecOperation`](#chainsaw-kyverno-io-v1alpha1-ExecOperation) |  |  | <p>Exec provides a command or script that should be executed as a part of this test step.</p> |
 
 ## `PodLogs`     {#chainsaw-kyverno-io-v1alpha1-PodLogs}
 


Test patch:
diff --git a/.crds/chainsaw.kyverno.io_tests.yaml b/.crds/chainsaw.kyverno.io_tests.yaml
index 272082e4..a6002b21 100644
--- a/.crds/chainsaw.kyverno.io_tests.yaml
+++ b/.crds/chainsaw.kyverno.io_tests.yaml
@@ -267,62 +267,52 @@ spec:
                       items:
                         properties:
                           apply:
-                            description: Apply lists the resources that should be
+                            description: Apply represents resources that should be
                               applied for this test step. This can include things
                               like configuration settings or any other resources that
                               need to be available during the test.
-                            items:
-                              description: Apply represents a set of configurations
-                                or resources that should be applied during testing.
-                              properties:
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                file:
-                                  description: File is the path to the referenced
-                                    file.
-                                  type: string
-                                shouldFail:
-                                  description: ShouldFail determines whether applying
-                                    the file is expected to fail.
-                                  type: boolean
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              required:
-                              - file
-                              type: object
-                            type: array
+                            properties:
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              file:
+                                description: File is the path to the referenced file.
+                                type: string
+                              shouldFail:
+                                description: ShouldFail determines whether applying
+                                  the file is expected to fail.
+                                type: boolean
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - file
+                            type: object
                           assert:
-                            description: Assert represents the assertions to be made
-                              for this test step. It checks whether the conditions
-                              specified in each assertion hold true.
-                            items:
-                              description: Assert represents a test condition that
-                                is expected to hold true during the testing process.
-                              properties:
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                file:
-                                  description: File is the path to the referenced
-                                    file.
-                                  type: string
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              required:
-                              - file
-                              type: object
-                            type: array
+                            description: Assert represents an assertion to be made.
+                              It checks whether the conditions specified in the assertion
+                              hold true.
+                            properties:
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              file:
+                                description: File is the path to the referenced file.
+                                type: string
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - file
+                            type: object
                           create:
                             description: Create represents a creation operation.
                             properties:
@@ -347,124 +337,105 @@ spec:
                             - file
                             type: object
                           delete:
-                            description: Delete provides a list of objects that should
-                              be deleted before this test step is executed. This helps
-                              in ensuring that the environment is set up correctly
-                              before the test step runs.
-                            items:
-                              description: Delete is a reference to an object that
-                                should be deleted
-                              properties:
-                                apiVersion:
-                                  description: API version of the referent.
-                                  type: string
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                kind:
-                                  description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-                                  type: string
-                                labels:
-                                  additionalProperties:
-                                    type: string
-                                  description: Label selector to match objects to
-                                    delete
-                                  type: object
-                                name:
-                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
-                                  type: string
-                                namespace:
-                                  description: 'Namespace of the referent. More info:
-                                    https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
-                                  type: string
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
+                            description: Delete represents a creation operation.
+                            properties:
+                              apiVersion:
+                                description: API version of the referent.
+                                type: string
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              kind:
+                                description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                                type: string
+                              labels:
+                                additionalProperties:
                                   type: string
-                              required:
-                              - apiVersion
-                              - kind
-                              type: object
-                            type: array
+                                description: Label selector to match objects to delete
+                                type: object
+                              name:
+                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                                type: string
+                              namespace:
+                                description: 'Namespace of the referent. More info:
+                                  https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
+                                type: string
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - apiVersion
+                            - kind
+                            type: object
                           error:
-                            description: Error lists the expected errors for this
-                              test step. If any of these errors occur, the test will
-                              consider them as expected; otherwise, they will be treated
-                              as test failures.
-                            items:
-                              description: Error represents an anticipated error condition
-                                that may arise during testing. Instead of treating
-                                such an error as a test failure, it acknowledges it
-                                as expected.
-                              properties:
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                file:
-                                  description: File is the path to the referenced
-                                    file.
-                                  type: string
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              required:
-                              - file
-                              type: object
-                            type: array
+                            description: Error represents the expected errors for
+                              this test step. If any of these errors occur, the test
+                              will consider them as expected; otherwise, they will
+                              be treated as test failures.
+                            properties:
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              file:
+                                description: File is the path to the referenced file.
+                                type: string
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - file
+                            type: object
                           exec:
-                            description: Exec provides a list of commands and/or scripts
-                              that should be executed as a part of this test step.
-                            items:
-                              description: Exec describes a command and/or script
-                                operation.
-                              properties:
-                                command:
-                                  description: Command defines a command to run.
-                                  properties:
-                                    args:
-                                      description: Args is the command arguments.
-                                      items:
-                                        type: string
-                                      type: array
-                                    entrypoint:
-                                      description: Entrypoint is the command entry
-                                        point to run.
-                                      type: string
-                                  required:
-                                  - entrypoint
-                                  type: object
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                script:
-                                  description: Script defines a script to run.
-                                  properties:
-                                    content:
-                                      description: Content defines a shell script
-                                        (run with "sh -c ...").
+                            description: Exec provides a command or script that should
+                              be executed as a part of this test step.
+                            properties:
+                              command:
+                                description: Command defines a command to run.
+                                properties:
+                                  args:
+                                    description: Args is the command arguments.
+                                    items:
                                       type: string
-                                  type: object
-                                skipLogOutput:
-                                  description: SkipLogOutput removes the output from
-                                    the command. Useful for sensitive logs or to reduce
-                                    noise.
-                                  type: boolean
-                                timeout:
-                                  description: Timeout for the command. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              type: object
-                            type: array
+                                    type: array
+                                  entrypoint:
+                                    description: Entrypoint is the command entry point
+                                      to run.
+                                    type: string
+                                required:
+                                - entrypoint
+                                type: object
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              script:
+                                description: Script defines a script to run.
+                                properties:
+                                  content:
+                                    description: Content defines a shell script (run
+                                      with "sh -c ...").
+                                    type: string
+                                type: object
+                              skipLogOutput:
+                                description: SkipLogOutput removes the output from
+                                  the command. Useful for sensitive logs or to reduce
+                                  noise.
+                                type: boolean
+                              timeout:
+                                description: Timeout for the command. Overrides the
+                                  global timeout set in the Configuration.
+                                type: string
+                            type: object
                         type: object
                       type: array
                   required:
diff --git a/.crds/chainsaw.kyverno.io_teststeps.yaml b/.crds/chainsaw.kyverno.io_teststeps.yaml
index 81ea10a0..78d6f837 100644
--- a/.crds/chainsaw.kyverno.io_teststeps.yaml
+++ b/.crds/chainsaw.kyverno.io_teststeps.yaml
@@ -235,60 +235,51 @@ spec:
                 items:
                   properties:
                     apply:
-                      description: Apply lists the resources that should be applied
+                      description: Apply represents resources that should be applied
                         for this test step. This can include things like configuration
                         settings or any other resources that need to be available
                         during the test.
-                      items:
-                        description: Apply represents a set of configurations or resources
-                          that should be applied during testing.
-                        properties:
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          file:
-                            description: File is the path to the referenced file.
-                            type: string
-                          shouldFail:
-                            description: ShouldFail determines whether applying the
-                              file is expected to fail.
-                            type: boolean
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
-                            type: string
-                        required:
-                        - file
-                        type: object
-                      type: array
+                      properties:
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        file:
+                          description: File is the path to the referenced file.
+                          type: string
+                        shouldFail:
+                          description: ShouldFail determines whether applying the
+                            file is expected to fail.
+                          type: boolean
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - file
+                      type: object
                     assert:
-                      description: Assert represents the assertions to be made for
-                        this test step. It checks whether the conditions specified
-                        in each assertion hold true.
-                      items:
-                        description: Assert represents a test condition that is expected
-                          to hold true during the testing process.
-                        properties:
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          file:
-                            description: File is the path to the referenced file.
-                            type: string
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
-                            type: string
-                        required:
-                        - file
-                        type: object
-                      type: array
+                      description: Assert represents an assertion to be made. It checks
+                        whether the conditions specified in the assertion hold true.
+                      properties:
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        file:
+                          description: File is the path to the referenced file.
+                          type: string
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - file
+                      type: object
                     create:
                       description: Create represents a creation operation.
                       properties:
@@ -313,117 +304,103 @@ spec:
                       - file
                       type: object
                     delete:
-                      description: Delete provides a list of objects that should be
-                        deleted before this test step is executed. This helps in ensuring
-                        that the environment is set up correctly before the test step
-                        runs.
-                      items:
-                        description: Delete is a reference to an object that should
-                          be deleted
-                        properties:
-                          apiVersion:
-                            description: API version of the referent.
-                            type: string
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          kind:
-                            description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-                            type: string
-                          labels:
-                            additionalProperties:
-                              type: string
-                            description: Label selector to match objects to delete
-                            type: object
-                          name:
-                            description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
-                            type: string
-                          namespace:
-                            description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
-                            type: string
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
+                      description: Delete represents a creation operation.
+                      properties:
+                        apiVersion:
+                          description: API version of the referent.
+                          type: string
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        kind:
+                          description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                          type: string
+                        labels:
+                          additionalProperties:
                             type: string
-                        required:
-                        - apiVersion
-                        - kind
-                        type: object
-                      type: array
+                          description: Label selector to match objects to delete
+                          type: object
+                        name:
+                          description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                          type: string
+                        namespace:
+                          description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
+                          type: string
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - apiVersion
+                      - kind
+                      type: object
                     error:
-                      description: Error lists the expected errors for this test step.
-                        If any of these errors occur, the test will consider them
-                        as expected; otherwise, they will be treated as test failures.
-                      items:
-                        description: Error represents an anticipated error condition
-                          that may arise during testing. Instead of treating such
-                          an error as a test failure, it acknowledges it as expected.
-                        properties:
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          file:
-                            description: File is the path to the referenced file.
-                            type: string
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
-                            type: string
-                        required:
-                        - file
-                        type: object
-                      type: array
+                      description: Error represents the expected errors for this test
+                        step. If any of these errors occur, the test will consider
+                        them as expected; otherwise, they will be treated as test
+                        failures.
+                      properties:
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        file:
+                          description: File is the path to the referenced file.
+                          type: string
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - file
+                      type: object
                     exec:
-                      description: Exec provides a list of commands and/or scripts
-                        that should be executed as a part of this test step.
-                      items:
-                        description: Exec describes a command and/or script operation.
-                        properties:
-                          command:
-                            description: Command defines a command to run.
-                            properties:
-                              args:
-                                description: Args is the command arguments.
-                                items:
-                                  type: string
-                                type: array
-                              entrypoint:
-                                description: Entrypoint is the command entry point
-                                  to run.
-                                type: string
-                            required:
-                            - entrypoint
-                            type: object
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          script:
-                            description: Script defines a script to run.
-                            properties:
-                              content:
-                                description: Content defines a shell script (run with
-                                  "sh -c ...").
+                      description: Exec provides a command or script that should be
+                        executed as a part of this test step.
+                      properties:
+                        command:
+                          description: Command defines a command to run.
+                          properties:
+                            args:
+                              description: Args is the command arguments.
+                              items:
                                 type: string
-                            type: object
-                          skipLogOutput:
-                            description: SkipLogOutput removes the output from the
-                              command. Useful for sensitive logs or to reduce noise.
-                            type: boolean
-                          timeout:
-                            description: Timeout for the command. Overrides the global
-                              timeout set in the Configuration.
-                            type: string
-                        type: object
-                      type: array
+                              type: array
+                            entrypoint:
+                              description: Entrypoint is the command entry point to
+                                run.
+                              type: string
+                          required:
+                          - entrypoint
+                          type: object
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        script:
+                          description: Script defines a script to run.
+                          properties:
+                            content:
+                              description: Content defines a shell script (run with
+                                "sh -c ...").
+                              type: string
+                          type: object
+                        skipLogOutput:
+                          description: SkipLogOutput removes the output from the command.
+                            Useful for sensitive logs or to reduce noise.
+                          type: boolean
+                        timeout:
+                          description: Timeout for the command. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      type: object
                   type: object
                 type: array
             required:
diff --git a/pkg/data/crds/chainsaw.kyverno.io_tests.yaml b/pkg/data/crds/chainsaw.kyverno.io_tests.yaml
index 272082e4..a6002b21 100644
--- a/pkg/data/crds/chainsaw.kyverno.io_tests.yaml
+++ b/pkg/data/crds/chainsaw.kyverno.io_tests.yaml
@@ -267,62 +267,52 @@ spec:
                       items:
                         properties:
                           apply:
-                            description: Apply lists the resources that should be
+                            description: Apply represents resources that should be
                               applied for this test step. This can include things
                               like configuration settings or any other resources that
                               need to be available during the test.
-                            items:
-                              description: Apply represents a set of configurations
-                                or resources that should be applied during testing.
-                              properties:
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                file:
-                                  description: File is the path to the referenced
-                                    file.
-                                  type: string
-                                shouldFail:
-                                  description: ShouldFail determines whether applying
-                                    the file is expected to fail.
-                                  type: boolean
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              required:
-                              - file
-                              type: object
-                            type: array
+                            properties:
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              file:
+                                description: File is the path to the referenced file.
+                                type: string
+                              shouldFail:
+                                description: ShouldFail determines whether applying
+                                  the file is expected to fail.
+                                type: boolean
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - file
+                            type: object
                           assert:
-                            description: Assert represents the assertions to be made
-                              for this test step. It checks whether the conditions
-                              specified in each assertion hold true.
-                            items:
-                              description: Assert represents a test condition that
-                                is expected to hold true during the testing process.
-                              properties:
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                file:
-                                  description: File is the path to the referenced
-                                    file.
-                                  type: string
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              required:
-                              - file
-                              type: object
-                            type: array
+                            description: Assert represents an assertion to be made.
+                              It checks whether the conditions specified in the assertion
+                              hold true.
+                            properties:
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              file:
+                                description: File is the path to the referenced file.
+                                type: string
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - file
+                            type: object
                           create:
                             description: Create represents a creation operation.
                             properties:
@@ -347,124 +337,105 @@ spec:
                             - file
                             type: object
                           delete:
-                            description: Delete provides a list of objects that should
-                              be deleted before this test step is executed. This helps
-                              in ensuring that the environment is set up correctly
-                              before the test step runs.
-                            items:
-                              description: Delete is a reference to an object that
-                                should be deleted
-                              properties:
-                                apiVersion:
-                                  description: API version of the referent.
-                                  type: string
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                kind:
-                                  description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-                                  type: string
-                                labels:
-                                  additionalProperties:
-                                    type: string
-                                  description: Label selector to match objects to
-                                    delete
-                                  type: object
-                                name:
-                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
-                                  type: string
-                                namespace:
-                                  description: 'Namespace of the referent. More info:
-                                    https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
-                                  type: string
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
+                            description: Delete represents a creation operation.
+                            properties:
+                              apiVersion:
+                                description: API version of the referent.
+                                type: string
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              kind:
+                                description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                                type: string
+                              labels:
+                                additionalProperties:
                                   type: string
-                              required:
-                              - apiVersion
-                              - kind
-                              type: object
-                            type: array
+                                description: Label selector to match objects to delete
+                                type: object
+                              name:
+                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                                type: string
+                              namespace:
+                                description: 'Namespace of the referent. More info:
+                                  https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
+                                type: string
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - apiVersion
+                            - kind
+                            type: object
                           error:
-                            description: Error lists the expected errors for this
-                              test step. If any of these errors occur, the test will
-                              consider them as expected; otherwise, they will be treated
-                              as test failures.
-                            items:
-                              description: Error represents an anticipated error condition
-                                that may arise during testing. Instead of treating
-                                such an error as a test failure, it acknowledges it
-                                as expected.
-                              properties:
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                file:
-                                  description: File is the path to the referenced
-                                    file.
-                                  type: string
-                                timeout:
-                                  description: Timeout for the operation. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              required:
-                              - file
-                              type: object
-                            type: array
+                            description: Error represents the expected errors for
+                              this test step. If any of these errors occur, the test
+                              will consider them as expected; otherwise, they will
+                              be treated as test failures.
+                            properties:
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              file:
+                                description: File is the path to the referenced file.
+                                type: string
+                              timeout:
+                                description: Timeout for the operation. Overrides
+                                  the global timeout set in the Configuration.
+                                type: string
+                            required:
+                            - file
+                            type: object
                           exec:
-                            description: Exec provides a list of commands and/or scripts
-                              that should be executed as a part of this test step.
-                            items:
-                              description: Exec describes a command and/or script
-                                operation.
-                              properties:
-                                command:
-                                  description: Command defines a command to run.
-                                  properties:
-                                    args:
-                                      description: Args is the command arguments.
-                                      items:
-                                        type: string
-                                      type: array
-                                    entrypoint:
-                                      description: Entrypoint is the command entry
-                                        point to run.
-                                      type: string
-                                  required:
-                                  - entrypoint
-                                  type: object
-                                continueOnError:
-                                  description: ContinueOnError determines whether
-                                    a test should continue or not in case the operation
-                                    was not successful. Even if the test continues
-                                    executing, it will still be reported as failed.
-                                  type: boolean
-                                script:
-                                  description: Script defines a script to run.
-                                  properties:
-                                    content:
-                                      description: Content defines a shell script
-                                        (run with "sh -c ...").
+                            description: Exec provides a command or script that should
+                              be executed as a part of this test step.
+                            properties:
+                              command:
+                                description: Command defines a command to run.
+                                properties:
+                                  args:
+                                    description: Args is the command arguments.
+                                    items:
                                       type: string
-                                  type: object
-                                skipLogOutput:
-                                  description: SkipLogOutput removes the output from
-                                    the command. Useful for sensitive logs or to reduce
-                                    noise.
-                                  type: boolean
-                                timeout:
-                                  description: Timeout for the command. Overrides
-                                    the global timeout set in the Configuration.
-                                  type: string
-                              type: object
-                            type: array
+                                    type: array
+                                  entrypoint:
+                                    description: Entrypoint is the command entry point
+                                      to run.
+                                    type: string
+                                required:
+                                - entrypoint
+                                type: object
+                              continueOnError:
+                                description: ContinueOnError determines whether a
+                                  test should continue or not in case the operation
+                                  was not successful. Even if the test continues executing,
+                                  it will still be reported as failed.
+                                type: boolean
+                              script:
+                                description: Script defines a script to run.
+                                properties:
+                                  content:
+                                    description: Content defines a shell script (run
+                                      with "sh -c ...").
+                                    type: string
+                                type: object
+                              skipLogOutput:
+                                description: SkipLogOutput removes the output from
+                                  the command. Useful for sensitive logs or to reduce
+                                  noise.
+                                type: boolean
+                              timeout:
+                                description: Timeout for the command. Overrides the
+                                  global timeout set in the Configuration.
+                                type: string
+                            type: object
                         type: object
                       type: array
                   required:
diff --git a/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml b/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml
index 81ea10a0..78d6f837 100644
--- a/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml
+++ b/pkg/data/crds/chainsaw.kyverno.io_teststeps.yaml
@@ -235,60 +235,51 @@ spec:
                 items:
                   properties:
                     apply:
-                      description: Apply lists the resources that should be applied
+                      description: Apply represents resources that should be applied
                         for this test step. This can include things like configuration
                         settings or any other resources that need to be available
                         during the test.
-                      items:
-                        description: Apply represents a set of configurations or resources
-                          that should be applied during testing.
-                        properties:
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          file:
-                            description: File is the path to the referenced file.
-                            type: string
-                          shouldFail:
-                            description: ShouldFail determines whether applying the
-                              file is expected to fail.
-                            type: boolean
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
-                            type: string
-                        required:
-                        - file
-                        type: object
-                      type: array
+                      properties:
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        file:
+                          description: File is the path to the referenced file.
+                          type: string
+                        shouldFail:
+                          description: ShouldFail determines whether applying the
+                            file is expected to fail.
+                          type: boolean
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - file
+                      type: object
                     assert:
-                      description: Assert represents the assertions to be made for
-                        this test step. It checks whether the conditions specified
-                        in each assertion hold true.
-                      items:
-                        description: Assert represents a test condition that is expected
-                          to hold true during the testing process.
-                        properties:
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          file:
-                            description: File is the path to the referenced file.
-                            type: string
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
-                            type: string
-                        required:
-                        - file
-                        type: object
-                      type: array
+                      description: Assert represents an assertion to be made. It checks
+                        whether the conditions specified in the assertion hold true.
+                      properties:
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        file:
+                          description: File is the path to the referenced file.
+                          type: string
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - file
+                      type: object
                     create:
                       description: Create represents a creation operation.
                       properties:
@@ -313,117 +304,103 @@ spec:
                       - file
                       type: object
                     delete:
-                      description: Delete provides a list of objects that should be
-                        deleted before this test step is executed. This helps in ensuring
-                        that the environment is set up correctly before the test step
-                        runs.
-                      items:
-                        description: Delete is a reference to an object that should
-                          be deleted
-                        properties:
-                          apiVersion:
-                            description: API version of the referent.
-                            type: string
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          kind:
-                            description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
-                            type: string
-                          labels:
-                            additionalProperties:
-                              type: string
-                            description: Label selector to match objects to delete
-                            type: object
-                          name:
-                            description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
-                            type: string
-                          namespace:
-                            description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
-                            type: string
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
+                      description: Delete represents a creation operation.
+                      properties:
+                        apiVersion:
+                          description: API version of the referent.
+                          type: string
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        kind:
+                          description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                          type: string
+                        labels:
+                          additionalProperties:
                             type: string
-                        required:
-                        - apiVersion
-                        - kind
-                        type: object
-                      type: array
+                          description: Label selector to match objects to delete
+                          type: object
+                        name:
+                          description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                          type: string
+                        namespace:
+                          description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
+                          type: string
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - apiVersion
+                      - kind
+                      type: object
                     error:
-                      description: Error lists the expected errors for this test step.
-                        If any of these errors occur, the test will consider them
-                        as expected; otherwise, they will be treated as test failures.
-                      items:
-                        description: Error represents an anticipated error condition
-                          that may arise during testing. Instead of treating such
-                          an error as a test failure, it acknowledges it as expected.
-                        properties:
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          file:
-                            description: File is the path to the referenced file.
-                            type: string
-                          timeout:
-                            description: Timeout for the operation. Overrides the
-                              global timeout set in the Configuration.
-                            type: string
-                        required:
-                        - file
-                        type: object
-                      type: array
+                      description: Error represents the expected errors for this test
+                        step. If any of these errors occur, the test will consider
+                        them as expected; otherwise, they will be treated as test
+                        failures.
+                      properties:
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        file:
+                          description: File is the path to the referenced file.
+                          type: string
+                        timeout:
+                          description: Timeout for the operation. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      required:
+                      - file
+                      type: object
                     exec:
-                      description: Exec provides a list of commands and/or scripts
-                        that should be executed as a part of this test step.
-                      items:
-                        description: Exec describes a command and/or script operation.
-                        properties:
-                          command:
-                            description: Command defines a command to run.
-                            properties:
-                              args:
-                                description: Args is the command arguments.
-                                items:
-                                  type: string
-                                type: array
-                              entrypoint:
-                                description: Entrypoint is the command entry point
-                                  to run.
-                                type: string
-                            required:
-                            - entrypoint
-                            type: object
-                          continueOnError:
-                            description: ContinueOnError determines whether a test
-                              should continue or not in case the operation was not
-                              successful. Even if the test continues executing, it
-                              will still be reported as failed.
-                            type: boolean
-                          script:
-                            description: Script defines a script to run.
-                            properties:
-                              content:
-                                description: Content defines a shell script (run with
-                                  "sh -c ...").
+                      description: Exec provides a command or script that should be
+                        executed as a part of this test step.
+                      properties:
+                        command:
+                          description: Command defines a command to run.
+                          properties:
+                            args:
+                              description: Args is the command arguments.
+                              items:
                                 type: string
-                            type: object
-                          skipLogOutput:
-                            description: SkipLogOutput removes the output from the
-                              command. Useful for sensitive logs or to reduce noise.
-                            type: boolean
-                          timeout:
-                            description: Timeout for the command. Overrides the global
-                              timeout set in the Configuration.
-                            type: string
-                        type: object
-                      type: array
+                              type: array
+                            entrypoint:
+                              description: Entrypoint is the command entry point to
+                                run.
+                              type: string
+                          required:
+                          - entrypoint
+                          type: object
+                        continueOnError:
+                          description: ContinueOnError determines whether a test should
+                            continue or not in case the operation was not successful.
+                            Even if the test continues executing, it will still be
+                            reported as failed.
+                          type: boolean
+                        script:
+                          description: Script defines a script to run.
+                          properties:
+                            content:
+                              description: Content defines a shell script (run with
+                                "sh -c ...").
+                              type: string
+                          type: object
+                        skipLogOutput:
+                          description: SkipLogOutput removes the output from the command.
+                            Useful for sensitive logs or to reduce noise.
+                          type: boolean
+                        timeout:
+                          description: Timeout for the command. Overrides the global
+                            timeout set in the Configuration.
+                          type: string
+                      type: object
                   type: object
                 type: array
             required:
diff --git a/pkg/discovery/discovery_test.go b/pkg/discovery/discovery_test.go
index c194c62f..ec795dfd 100644
--- a/pkg/discovery/discovery_test.go
+++ b/pkg/discovery/discovery_test.go
@@ -15,142 +15,129 @@ func TestDiscoverTests(t *testing.T) {
 		paths    []string
 		want     []Test
 		wantErr  bool
-	}{
-		{
-			name:     "test",
-			fileName: "chainsaw-test.yaml",
-			paths:    []string{"../../testdata/discovery/test"},
-			want: []Test{{
-				BasePath: "../../testdata/discovery/test",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "test",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "create configmap",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "configmap.yaml",
-											},
-										}},
+	}{{
+		name:     "test",
+		fileName: "chainsaw-test.yaml",
+		paths:    []string{"../../testdata/discovery/test"},
+		want: []Test{{
+			BasePath: "../../testdata/discovery/test",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "test",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "create configmap",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "configmap.yaml",
 									},
-								},
+								}},
 							},
-						}, {
-							Name: "assert configmap",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "configmap.yaml",
-											},
-										}},
+						},
+					}, {
+						Name: "assert configmap",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "configmap.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}},
+						},
+					}},
 				},
-			}},
-			wantErr: false,
-		},
-		{
-			name:     "manifests",
-			fileName: "chainsaw-test.yaml",
-			paths:    []string{"../../testdata/discovery/manifests"},
-			want: []Test{{
-				BasePath: "../../testdata/discovery/manifests",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "manifests",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "assert",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-assert.yaml",
-											},
-										}},
+			},
+		}},
+		wantErr: false,
+	}, {
+		name:     "manifests",
+		fileName: "chainsaw-test.yaml",
+		paths:    []string{"../../testdata/discovery/manifests"},
+		want: []Test{{
+			BasePath: "../../testdata/discovery/manifests",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "manifests",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "assert",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "01-assert.yaml",
 									},
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-configmap.yaml",
-											},
-										}},
+								},
+							}, {
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "01-configmap.yaml",
 									},
-									{
-										Error: []v1alpha1.Error{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-error.yaml",
-											},
-										}},
+								},
+							}, {
+								Error: &v1alpha1.Error{
+									FileRef: v1alpha1.FileRef{
+										File: "01-error.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}},
+						},
+					}},
+				},
+			},
+		}},
+		wantErr: false,
+	}, {
+		name:     "steps",
+		fileName: "chainsaw-test.yaml",
+		paths:    []string{"../../testdata/discovery/steps"},
+		want: []Test{{
+			BasePath: "../../testdata/discovery/steps",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
 				},
-			}},
-			wantErr: false,
-		},
-		{
-			name:     "steps",
-			fileName: "chainsaw-test.yaml",
-			paths:    []string{"../../testdata/discovery/steps"},
-			want: []Test{{
-				BasePath: "../../testdata/discovery/steps",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "steps",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "test-1",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "bar.yaml",
-											},
-										}},
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "foo.yaml",
-											},
-										}},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "steps",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "test-1",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "foo.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}, {
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "bar.yaml",
+									},
+								},
+							}},
+						},
+					}},
 				},
-			}},
-			wantErr: false,
-		},
-	}
+			},
+		}},
+		wantErr: false,
+	}}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			got, err := DiscoverTests(tt.fileName, tt.paths...)
diff --git a/pkg/discovery/load_test.go b/pkg/discovery/load_test.go
index 62178e9a..4c8581f5 100644
--- a/pkg/discovery/load_test.go
+++ b/pkg/discovery/load_test.go
@@ -18,306 +18,283 @@ func TestLoadTest(t *testing.T) {
 		path     string
 		want     *Test
 		wantErr  bool
-	}{
-		{
-			name:     "invalid path",
-			fileName: "chainsaw-test.yaml",
-			path:     "/invalid",
-			want:     nil,
-			wantErr:  true,
-		},
-		{
-			name:     "no path",
-			fileName: "chainsaw-test.yaml",
-			path:     "",
-			want:     nil,
-			wantErr:  true,
-		},
-		{
-			name:     "test",
-			fileName: "chainsaw-test.yaml",
-			path:     filepath.Join(basePath, "test"),
-			want: &Test{
-				BasePath: "../../testdata/discovery/test",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "test",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "create configmap",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "configmap.yaml",
-											},
-										}},
+	}{{
+		name:     "invalid path",
+		fileName: "chainsaw-test.yaml",
+		path:     "/invalid",
+		want:     nil,
+		wantErr:  true,
+	}, {
+		name:     "no path",
+		fileName: "chainsaw-test.yaml",
+		path:     "",
+		want:     nil,
+		wantErr:  true,
+	}, {
+		name:     "test",
+		fileName: "chainsaw-test.yaml",
+		path:     filepath.Join(basePath, "test"),
+		want: &Test{
+			BasePath: "../../testdata/discovery/test",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "test",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "create configmap",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{
+								{
+									Apply: &v1alpha1.Apply{
+										FileRef: v1alpha1.FileRef{
+											File: "configmap.yaml",
+										},
 									},
 								},
 							},
-						}, {
-							Name: "assert configmap",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "configmap.yaml",
-											},
-										}},
+						},
+					}, {
+						Name: "assert configmap",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "configmap.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}},
+						},
+					}},
 				},
 			},
-			wantErr: false,
 		},
-		{
-			name:     "test",
-			fileName: "chainsaw-test.yaml",
-			path:     filepath.Join(basePath, "invalid-test-and-steps"),
-			want: &Test{
-				BasePath: "../../testdata/discovery/invalid-test-and-steps",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "test",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "create configmap",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "configmap.yaml",
-											},
-										}},
+		wantErr: false,
+	}, {
+		name:     "test",
+		fileName: "chainsaw-test.yaml",
+		path:     filepath.Join(basePath, "invalid-test-and-steps"),
+		want: &Test{
+			BasePath: "../../testdata/discovery/invalid-test-and-steps",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "test",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "create configmap",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{
+								{
+									Apply: &v1alpha1.Apply{
+										FileRef: v1alpha1.FileRef{
+											File: "configmap.yaml",
+										},
 									},
 								},
 							},
-						}, {
-							Name: "assert configmap",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "configmap.yaml",
-											},
-										}},
+						},
+					}, {
+						Name: "assert configmap",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{
+								{
+									Assert: &v1alpha1.Assert{
+										FileRef: v1alpha1.FileRef{
+											File: "configmap.yaml",
+										},
 									},
 								},
 							},
-						}},
-					},
+						},
+					}},
 				},
 			},
-			wantErr: false,
 		},
-		{
-			name:     "test",
-			fileName: "chainsaw-test.yaml",
-			path:     filepath.Join(basePath, "test-and-steps"),
-			want: &Test{
-				BasePath: "../../testdata/discovery/test-and-steps",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "test",
-					},
-					Spec: v1alpha1.TestSpec{
-						Skip:       ptr.To(false),
-						Concurrent: ptr.To(false),
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "test-1",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "foo.yaml",
-											},
-										}},
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "bar.yaml",
-											},
-										}},
+		wantErr: false,
+	}, {
+		name:     "test",
+		fileName: "chainsaw-test.yaml",
+		path:     filepath.Join(basePath, "test-and-steps"),
+		want: &Test{
+			BasePath: "../../testdata/discovery/test-and-steps",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "test",
+				},
+				Spec: v1alpha1.TestSpec{
+					Skip:       ptr.To(false),
+					Concurrent: ptr.To(false),
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "test-1",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "foo.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}, {
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "bar.yaml",
+									},
+								},
+							}},
+						},
+					}},
 				},
 			},
-			wantErr: false,
 		},
-		{
-			name:     "steps",
-			fileName: "chainsaw-test.yaml",
-			path:     filepath.Join(basePath, "steps"),
-			want: &Test{
-				BasePath: "../../testdata/discovery/steps",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "steps",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "test-1",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "foo.yaml",
-											},
-										}},
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "bar.yaml",
-											},
-										}},
+		wantErr: false,
+	}, {
+		name:     "steps",
+		fileName: "chainsaw-test.yaml",
+		path:     filepath.Join(basePath, "steps"),
+		want: &Test{
+			BasePath: "../../testdata/discovery/steps",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "steps",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "test-1",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "foo.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}, {
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "bar.yaml",
+									},
+								},
+							}},
+						},
+					}},
 				},
 			},
-			wantErr: false,
 		},
-		{
-			name:     "steps",
-			fileName: "chainsaw-test.yaml",
-			path:     filepath.Join(basePath, "steps-and-manifests"),
-			want: &Test{
-				BasePath: "../../testdata/discovery/steps-and-manifests",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "steps-and-manifests",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "test-1",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "bar.yaml",
-											},
-										}},
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "foo.yaml",
-											},
-										}},
+		wantErr: false,
+	}, {
+		name:     "steps",
+		fileName: "chainsaw-test.yaml",
+		path:     filepath.Join(basePath, "steps-and-manifests"),
+		want: &Test{
+			BasePath: "../../testdata/discovery/steps-and-manifests",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "steps-and-manifests",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "test-1",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "foo.yaml",
 									},
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-assert.yaml",
-											},
-										}},
+								},
+							}, {
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "bar.yaml",
 									},
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-configmap.yaml",
-											},
-										}},
+								},
+							}, {
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "01-assert.yaml",
 									},
-									{
-										Error: []v1alpha1.Error{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-error.yaml",
-											},
-										}},
+								},
+							}, {
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "01-configmap.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}, {
+								Error: &v1alpha1.Error{
+									FileRef: v1alpha1.FileRef{
+										File: "01-error.yaml",
+									},
+								},
+							}},
+						},
+					}},
 				},
 			},
-			wantErr: false,
 		},
-		{
-			name:     "manifests",
-			fileName: "chainsaw-test.yaml",
-			path:     filepath.Join(basePath, "manifests"),
-			want: &Test{
-				BasePath: "../../testdata/discovery/manifests",
-				Test: &v1alpha1.Test{
-					TypeMeta: metav1.TypeMeta{
-						APIVersion: "chainsaw.kyverno.io/v1alpha1",
-						Kind:       "Test",
-					},
-					ObjectMeta: metav1.ObjectMeta{
-						Name: "manifests",
-					},
-					Spec: v1alpha1.TestSpec{
-						Steps: []v1alpha1.TestSpecStep{{
-							Name: "assert",
-							Spec: v1alpha1.TestStepSpec{
-								Try: []v1alpha1.Operation{
-									{
-										Assert: []v1alpha1.Assert{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-assert.yaml",
-											},
-										}},
+		wantErr: false,
+	}, {
+		name:     "manifests",
+		fileName: "chainsaw-test.yaml",
+		path:     filepath.Join(basePath, "manifests"),
+		want: &Test{
+			BasePath: "../../testdata/discovery/manifests",
+			Test: &v1alpha1.Test{
+				TypeMeta: metav1.TypeMeta{
+					APIVersion: "chainsaw.kyverno.io/v1alpha1",
+					Kind:       "Test",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "manifests",
+				},
+				Spec: v1alpha1.TestSpec{
+					Steps: []v1alpha1.TestSpecStep{{
+						Name: "assert",
+						Spec: v1alpha1.TestStepSpec{
+							Try: []v1alpha1.Operation{{
+								Assert: &v1alpha1.Assert{
+									FileRef: v1alpha1.FileRef{
+										File: "01-assert.yaml",
 									},
-									{
-										Apply: []v1alpha1.Apply{{
-											FileRef: v1alpha1.FileRef{
-												File: "01-configmap.yaml",
-											},
-										}},
+								},
+							}, {
+								Apply: &v1alpha1.Apply{
+									FileRef: v1alpha1.FileRef{
+										File: "01-configmap.yaml",
 									},
-									{
-										Error: []v1alpha1.Error{
-											{
-												FileRef: v1alpha1.FileRef{
-													File: "01-error.yaml",
-												},
-											},
-										},
+								},
+							}, {
+								Error: &v1alpha1.Error{
+									FileRef: v1alpha1.FileRef{
+										File: "01-error.yaml",
 									},
 								},
-							},
-						}},
-					},
+							}},
+						},
+					}},
 				},
 			},
-			wantErr: false,
 		},
-	}
+		wantErr: false,
+	}}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			got, err := LoadTest(tt.fileName, tt.path)
diff --git a/pkg/step/load_test.go b/pkg/step/load_test.go
index a617bd7d..ba6f9b36 100644
--- a/pkg/step/load_test.go
+++ b/pkg/step/load_test.go
@@ -57,20 +57,19 @@ func TestLoad(t *testing.T) {
 					Name: "test-1",
 				},
 				Spec: v1alpha1.TestStepSpec{
-					Try: []v1alpha1.Operation{
-						{
-							Apply: []v1alpha1.Apply{{
-								FileRef: v1alpha1.FileRef{
-									File: "foo.yaml",
-								},
-							}},
-							Assert: []v1alpha1.Assert{{
-								FileRef: v1alpha1.FileRef{
-									File: "bar.yaml",
-								},
-							}},
+					Try: []v1alpha1.Operation{{
+						Apply: &v1alpha1.Apply{
+							FileRef: v1alpha1.FileRef{
+								File: "foo.yaml",
+							},
+						},
+					}, {
+						Assert: &v1alpha1.Assert{
+							FileRef: v1alpha1.FileRef{
+								File: "bar.yaml",
+							},
 						},
-					},
+					}},
 				},
 			},
 		},
@@ -87,20 +86,19 @@ func TestLoad(t *testing.T) {
 					Name: "test",
 				},
 				Spec: v1alpha1.TestStepSpec{
-					Try: []v1alpha1.Operation{
-						{
-							Apply: []v1alpha1.Apply{{
-								FileRef: v1alpha1.FileRef{
-									File: "foo.yaml",
-								},
-							}},
-							Assert: []v1alpha1.Assert{{
-								FileRef: v1alpha1.FileRef{
-									File: "bar.yaml",
-								},
-							}},
+					Try: []v1alpha1.Operation{{
+						Apply: &v1alpha1.Apply{
+							FileRef: v1alpha1.FileRef{
+								File: "foo.yaml",
+							},
 						},
-					},
+					}, {
+						Assert: &v1alpha1.Assert{
+							FileRef: v1alpha1.FileRef{
+								File: "bar.yaml",
+							},
+						},
+					}},
 					Catch: []v1alpha1.Catch{{
 						Collect: &v1alpha1.Collect{
 							PodLogs: &v1alpha1.PodLogs{
@@ -142,20 +140,19 @@ func TestLoad(t *testing.T) {
 					Name: "test",
 				},
 				Spec: v1alpha1.TestStepSpec{
-					Try: []v1alpha1.Operation{
-						{
-							Apply: []v1alpha1.Apply{{
-								FileRef: v1alpha1.FileRef{
-									File: "foo.yaml",
-								},
-							}},
-							Assert: []v1alpha1.Assert{{
-								FileRef: v1alpha1.FileRef{
-									File: "bar.yaml",
-								},
-							}},
+					Try: []v1alpha1.Operation{{
+						Apply: &v1alpha1.Apply{
+							FileRef: v1alpha1.FileRef{
+								File: "foo.yaml",
+							},
 						},
-					},
+					}, {
+						Assert: &v1alpha1.Assert{
+							FileRef: v1alpha1.FileRef{
+								File: "bar.yaml",
+							},
+						},
+					}},
 					Finally: []v1alpha1.Finally{{
 						Collect: &v1alpha1.Collect{
 							PodLogs: &v1alpha1.PodLogs{
@@ -197,20 +194,19 @@ func TestLoad(t *testing.T) {
 					Name: "test-1",
 				},
 				Spec: v1alpha1.TestStepSpec{
-					Try: []v1alpha1.Operation{
-						{
-							Apply: []v1alpha1.Apply{{
-								FileRef: v1alpha1.FileRef{
-									File: "foo.yaml",
-								},
-							}},
-							Assert: []v1alpha1.Assert{{
-								FileRef: v1alpha1.FileRef{
-									File: "bar.yaml",
-								},
-							}},
+					Try: []v1alpha1.Operation{{
+						Apply: &v1alpha1.Apply{
+							FileRef: v1alpha1.FileRef{
+								File: "foo.yaml",
+							},
+						},
+					}, {
+						Assert: &v1alpha1.Assert{
+							FileRef: v1alpha1.FileRef{
+								File: "bar.yaml",
+							},
 						},
-					},
+					}},
 				},
 			},
 			{
@@ -222,20 +218,19 @@ func TestLoad(t *testing.T) {
 					Name: "test-2",
 				},
 				Spec: v1alpha1.TestStepSpec{
-					Try: []v1alpha1.Operation{
-						{
-							Apply: []v1alpha1.Apply{{
-								FileRef: v1alpha1.FileRef{
-									File: "bar.yaml",
-								},
-							}},
-							Assert: []v1alpha1.Assert{{
-								FileRef: v1alpha1.FileRef{
-									File: "foo.yaml",
-								},
-							}},
+					Try: []v1alpha1.Operation{{
+						Apply: &v1alpha1.Apply{
+							FileRef: v1alpha1.FileRef{
+								File: "bar.yaml",
+							},
+						},
+					}, {
+						Assert: &v1alpha1.Assert{
+							FileRef: v1alpha1.FileRef{
+								File: "foo.yaml",
+							},
 						},
-					},
+					}},
 				},
 			},
 		},
diff --git a/pkg/test/load_test.go b/pkg/test/load_test.go
index de6e1791..3e676ac3 100644
--- a/pkg/test/load_test.go
+++ b/pkg/test/load_test.go
@@ -62,14 +62,12 @@ func TestLoad(t *testing.T) {
 			Spec: v1alpha1.TestSpec{
 				Steps: []v1alpha1.TestSpecStep{{
 					Spec: v1alpha1.TestStepSpec{
-						Try: []v1alpha1.Operation{
-							{
-								Apply: []v1alpha1.Apply{{
-									FileRef: v1alpha1.FileRef{
-										File: "foo.yaml",
-									},
-								}},
-							},
+						Try: []v1alpha1.Operation{{
+							Apply: &v1alpha1.Apply{
+								FileRef: v1alpha1.FileRef{
+									File: "foo.yaml",
+								},
+							}},
 						},
 						Catch: []v1alpha1.Catch{{
 							Collect: &v1alpha1.Collect{
@@ -99,14 +97,12 @@ func TestLoad(t *testing.T) {
 					},
 				}, {
 					Spec: v1alpha1.TestStepSpec{
-						Try: []v1alpha1.Operation{
-							{
-								Assert: []v1alpha1.Assert{{
-									FileRef: v1alpha1.FileRef{
-										File: "bar.yaml",
-									},
-								}},
-							},
+						Try: []v1alpha1.Operation{{
+							Assert: &v1alpha1.Assert{
+								FileRef: v1alpha1.FileRef{
+									File: "bar.yaml",
+								},
+							}},
 						},
 						Finally: []v1alpha1.Finally{{
 							Collect: &v1alpha1.Collect{
diff --git a/testdata/discovery/invalid-test-and-steps/01-test.yaml b/testdata/discovery/invalid-test-and-steps/01-test.yaml
index 8a94cd3e..26acf7eb 100644
--- a/testdata/discovery/invalid-test-and-steps/01-test.yaml
+++ b/testdata/discovery/invalid-test-and-steps/01-test.yaml
@@ -3,8 +3,8 @@ kind: TestStep
 metadata:
   name: test-1
 spec:
-  operations:
-    - apply:
-        - file: foo.yaml
-    - assert:
-        - file: bar.yaml
+  try:
+  - apply:
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
diff --git a/testdata/discovery/invalid-test-and-steps/chainsaw-test.yaml b/testdata/discovery/invalid-test-and-steps/chainsaw-test.yaml
index a6b65218..6a57f7d1 100644
--- a/testdata/discovery/invalid-test-and-steps/chainsaw-test.yaml
+++ b/testdata/discovery/invalid-test-and-steps/chainsaw-test.yaml
@@ -7,8 +7,8 @@ spec:
   - name: create configmap
     try:
     - apply:
-      - file: configmap.yaml
+        file: configmap.yaml
   - name: assert configmap
     try:
     - assert:
-      - file: configmap.yaml
+        file: configmap.yaml
diff --git a/testdata/discovery/steps-and-manifests/01-test.yaml b/testdata/discovery/steps-and-manifests/01-test.yaml
index 54975661..26acf7eb 100644
--- a/testdata/discovery/steps-and-manifests/01-test.yaml
+++ b/testdata/discovery/steps-and-manifests/01-test.yaml
@@ -5,6 +5,6 @@ metadata:
 spec:
   try:
   - apply:
-    - file: foo.yaml
-    assert:
-    - file: bar.yaml
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
diff --git a/testdata/discovery/steps/01-test.yaml b/testdata/discovery/steps/01-test.yaml
index 54975661..26acf7eb 100644
--- a/testdata/discovery/steps/01-test.yaml
+++ b/testdata/discovery/steps/01-test.yaml
@@ -5,6 +5,6 @@ metadata:
 spec:
   try:
   - apply:
-    - file: foo.yaml
-    assert:
-    - file: bar.yaml
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
diff --git a/testdata/discovery/test-and-steps/01-test.yaml b/testdata/discovery/test-and-steps/01-test.yaml
index 54975661..26acf7eb 100644
--- a/testdata/discovery/test-and-steps/01-test.yaml
+++ b/testdata/discovery/test-and-steps/01-test.yaml
@@ -5,6 +5,6 @@ metadata:
 spec:
   try:
   - apply:
-    - file: foo.yaml
-    assert:
-    - file: bar.yaml
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
diff --git a/testdata/discovery/test/chainsaw-test.yaml b/testdata/discovery/test/chainsaw-test.yaml
index a6b65218..6a57f7d1 100644
--- a/testdata/discovery/test/chainsaw-test.yaml
+++ b/testdata/discovery/test/chainsaw-test.yaml
@@ -7,8 +7,8 @@ spec:
   - name: create configmap
     try:
     - apply:
-      - file: configmap.yaml
+        file: configmap.yaml
   - name: assert configmap
     try:
     - assert:
-      - file: configmap.yaml
+        file: configmap.yaml
diff --git a/testdata/kuttl/01-step.chainsaw.yaml b/testdata/kuttl/01-step.chainsaw.yaml
index 1da19cd3..593860c6 100755
--- a/testdata/kuttl/01-step.chainsaw.yaml
+++ b/testdata/kuttl/01-step.chainsaw.yaml
@@ -8,12 +8,14 @@ spec:
   timeouts: {}
   try:
   - delete:
-    - apiVersion: v1
+      apiVersion: v1
       kind: Pod
       name: my-pod
-    - apiVersion: v1
+  - delete:
+      apiVersion: v1
       kind: Pod
       labels:
         app: nginx
-    - apiVersion: v1
+  - delete:
+      apiVersion: v1
       kind: Pod
diff --git a/testdata/step/custom-step.yaml b/testdata/step/custom-step.yaml
index 88de6f6b..2f8f116a 100644
--- a/testdata/step/custom-step.yaml
+++ b/testdata/step/custom-step.yaml
@@ -6,29 +6,29 @@ spec:
   skipDelete: false
   try:
     - assert:
-        - file: /assertions/verify-service.yaml
-          timeout: 30s
-          continueOnError: false
+        file: /assertions/verify-service.yaml
+        timeout: 30s
+        continueOnError: false
     - apply:
-        - file: /configs/service-config.yaml
-          timeout: 45s
-          shouldFail: false
-          continueOnError: true
+        file: /configs/service-config.yaml
+        timeout: 45s
+        shouldFail: false
+        continueOnError: true
     - error:
-        - file: /errors/expected-timeout-error.yaml
-          timeout: 15s
-          continueOnError: true
+        file: /errors/expected-timeout-error.yaml
+        timeout: 15s
+        continueOnError: true
     - delete:
-        - apiVersion: v1
-          kind: Pod
-          name: example-pod
-          namespace: test
-          timeout: 10s
-          continueOnError: false
+        apiVersion: v1
+        kind: Pod
+        name: example-pod
+        namespace: test
+        timeout: 10s
+        continueOnError: false
     - exec:
-        - command:
-            entrypoint: /bin/sh
-            args:
-            - echo "Executing script..."
-          skipLogOutput: false
-          continueOnError: true
+        command:
+          entrypoint: /bin/sh
+          args:
+          - echo "Executing script..."
+        skipLogOutput: false
+        continueOnError: true
diff --git a/testdata/step/multiple.yaml b/testdata/step/multiple.yaml
index cce20c9e..79db03b6 100644
--- a/testdata/step/multiple.yaml
+++ b/testdata/step/multiple.yaml
@@ -5,9 +5,9 @@ metadata:
 spec:
   try:
   - apply:
-    - file: foo.yaml
-    assert:
-    - file: bar.yaml
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
 
 ---
 apiVersion: chainsaw.kyverno.io/v1alpha1
@@ -17,6 +17,6 @@ metadata:
 spec:
   try:
   - apply:
-    - file: bar.yaml
-    assert:
-    - file: foo.yaml
+      file: bar.yaml
+  - assert:
+      file: foo.yaml
diff --git a/testdata/step/ok.yaml b/testdata/step/ok.yaml
index 2e29f024..26002871 100644
--- a/testdata/step/ok.yaml
+++ b/testdata/step/ok.yaml
@@ -5,6 +5,6 @@ metadata:
 spec:
   try: 
   - apply:
-    - file: foo.yaml
-    assert:
-    - file: bar.yaml
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
diff --git a/testdata/step/with-catch.yaml b/testdata/step/with-catch.yaml
index 6a6131a7..16b104fa 100644
--- a/testdata/step/with-catch.yaml
+++ b/testdata/step/with-catch.yaml
@@ -5,9 +5,9 @@ metadata:
 spec:
   try: 
   - apply:
-    - file: foo.yaml
-    assert:
-    - file: bar.yaml
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
   catch:
   - collect:
       podLogs:
diff --git a/testdata/step/with-finally.yaml b/testdata/step/with-finally.yaml
index 0bcf5ebd..278f7445 100644
--- a/testdata/step/with-finally.yaml
+++ b/testdata/step/with-finally.yaml
@@ -5,9 +5,9 @@ metadata:
 spec:
   try: 
   - apply:
-    - file: foo.yaml
-    assert:
-    - file: bar.yaml
+      file: foo.yaml
+  - assert:
+      file: bar.yaml
   finally:
   - collect:
       podLogs:
diff --git a/testdata/test/custom-test.yaml b/testdata/test/custom-test.yaml
index 2acdb4e3..f66da72f 100644
--- a/testdata/test/custom-test.yaml
+++ b/testdata/test/custom-test.yaml
@@ -8,24 +8,24 @@ spec:
   skipDelete: true
   namespace: "custom-namespace-for-test"
   steps:
-    - name: "test-step-initial-setup"
-      timeouts:
-        apply: "5s"
-      skipDelete: false
-      try:
-        - apply:
-          - file: /configs/service-config.yaml
-            timeout: 45s
-            shouldFail: false
-            continueOnError: true
-    - name: "test-step-apply-changes"
-      try:
-        - apply:
-          - file: /configs/service-config.yaml
-            timeout: 45s
-            shouldFail: false
-            continueOnError: true
-          assert:
-            - file: /assertions/verify-service.yaml
-              timeout: 30s
-              continueOnError: false
+  - name: "test-step-initial-setup"
+    timeouts:
+      apply: "5s"
+    skipDelete: false
+    try:
+    - apply:
+        file: /configs/service-config.yaml
+        timeout: 45s
+        shouldFail: false
+        continueOnError: true
+  - name: "test-step-apply-changes"
+    try:
+    - apply:
+        file: /configs/service-config.yaml
+        timeout: 45s
+        shouldFail: false
+        continueOnError: true
+    - assert:
+        file: /assertions/verify-service.yaml
+        timeout: 30s
+        continueOnError: false
diff --git a/testdata/test/ok.yaml b/testdata/test/ok.yaml
index 696b0d06..07cef8f9 100644
--- a/testdata/test/ok.yaml
+++ b/testdata/test/ok.yaml
@@ -6,7 +6,7 @@ spec:
   steps:
   - try:
     - apply:
-      - file: foo.yaml
+        file: foo.yaml
     catch:
     - collect:
         podLogs:
@@ -22,7 +22,7 @@ spec:
           content: echo "hello"
   - try:
     - assert:
-      - file: bar.yaml
+        file: bar.yaml
     finally:
     - collect:
         podLogs: