diff --git a/contrib/container/pytest/README.md b/contrib/container/pytest/README.md index aee6f907912..d8850b185d4 100644 --- a/contrib/container/pytest/README.md +++ b/contrib/container/pytest/README.md @@ -13,7 +13,7 @@ of the Docker image in executor CRD, use command `kubectl apply -f container-executor-pytest.yaml` `kubectl apply -f pytest_test.yaml` -## Run resulted tests +## Run created tests Use `kubectl testkube run test container-executor-pytest-failed-sample` `kubectl testkube run test container-executor-pytest-passed-sample` diff --git a/contrib/executor/jmeter/pkg/parser/xjtl.go b/contrib/executor/jmeter/pkg/parser/xjtl.go index 7a39f620930..b65a1be7f33 100644 --- a/contrib/executor/jmeter/pkg/parser/xjtl.go +++ b/contrib/executor/jmeter/pkg/parser/xjtl.go @@ -6,13 +6,13 @@ import ( // TestResults is a root element of junit xml report type TestResults struct { - XMLName xml.Name `xml:"testResults"` - HTTPSamples []HTTPSample `xml:"httpSample,omitempty"` + XMLName xml.Name `xml:"testResults"` + HTTPSamples []Example `xml:"httpSample,omitempty"` + Samples []Example `xml:"sample,omitempty"` } -// HTTPSample is http sample details -type HTTPSample struct { - XMLName xml.Name `xml:"httpSample"` +// Example is example details +type Example struct { Time int `xml:"t,attr"` Success bool `xml:"s,attr"` Label string `xml:"lb,attr"` diff --git a/contrib/executor/jmeter/pkg/parser/xjtl_test.go b/contrib/executor/jmeter/pkg/parser/xjtl_test.go index 0fd770ac792..981abdb7156 100644 --- a/contrib/executor/jmeter/pkg/parser/xjtl_test.go +++ b/contrib/executor/jmeter/pkg/parser/xjtl_test.go @@ -34,6 +34,25 @@ const ( +` + + mixedXML = ` + + + + + + + + + + Fail Test + true + false + Test FAILED + + + ` ) @@ -73,4 +92,22 @@ func TestParseXML(t *testing.T) { assert.EqualError(t, err, "EOF") }) + + t.Run("parse XML mixed test", func(t *testing.T) { + t.Parallel() + + results, err := ParseXML([]byte(mixedXML)) + + assert.NoError(t, err) + assert.Equal(t, 1, len(results.HTTPSamples)) + assert.True(t, results.HTTPSamples[0].Success) + assert.Equal(t, 946, results.HTTPSamples[0].Time) + assert.Equal(t, "Get Token - HTTP Request", results.HTTPSamples[0].Label) + + assert.Equal(t, 3, len(results.Samples)) + assert.False(t, results.Samples[2].Success) + assert.Equal(t, 1, results.Samples[2].Time) + assert.Equal(t, "Alarms status are inactive. Unexpected Result! Failing the test!", results.Samples[2].Label) + assert.Equal(t, "Fail Test", results.Samples[2].AssertionResult.Name) + }) } diff --git a/contrib/executor/jmeter/pkg/runner/runner.go b/contrib/executor/jmeter/pkg/runner/runner.go index 8c00a0a9c9c..c10f3b017e1 100644 --- a/contrib/executor/jmeter/pkg/runner/runner.go +++ b/contrib/executor/jmeter/pkg/runner/runner.go @@ -258,7 +258,8 @@ func MapTestResultsToExecutionResults(out []byte, results parser.TestResults) (r result.Output = string(out) result.OutputType = "text/plain" - for _, r := range results.HTTPSamples { + samples := append(results.HTTPSamples, results.Samples...) + for _, r := range samples { if !r.Success { result.Status = testkube.ExecutionStatusFailed if r.AssertionResult != nil { diff --git a/docs/docs/articles/creating-tests.md b/docs/docs/articles/creating-tests.md index 72d625d4561..1660a99269c 100644 --- a/docs/docs/articles/creating-tests.md +++ b/docs/docs/articles/creating-tests.md @@ -402,6 +402,19 @@ spec: ``` +We also provide special helper methods to use in the job template: +`vartypeptrtostring` - method to convert a pointer to a variable type to a string type + +Usage example: +```yaml +{{- range $key, $value := .Variables }} + {{ if eq ($value.Type_ | vartypeptrtostring) "basic" }} + - name: TEST + value: "TEST" + {{- end }} +{{- end }} +``` + Add `imagePullSecrets` option if you use your own Image Registry. This will add the secret for both `init` and `executor` containers. diff --git a/pkg/api/v1/testkube/model_variable_type_extended.go b/pkg/api/v1/testkube/model_variable_type_extended.go index 7eedb041a84..dbb1ee0dc0e 100644 --- a/pkg/api/v1/testkube/model_variable_type_extended.go +++ b/pkg/api/v1/testkube/model_variable_type_extended.go @@ -6,3 +6,7 @@ func VariableTypePtr(stepType VariableType) *VariableType { var VariableTypeBasic = VariableTypePtr(BASIC_VariableType) var VariableTypeSecret = VariableTypePtr(SECRET_VariableType) + +func VariableTypeString(ptr *VariableType) string { + return string(*ptr) +} diff --git a/pkg/executor/client/job.go b/pkg/executor/client/job.go index cbfd13f519c..b316a79d813 100644 --- a/pkg/executor/client/job.go +++ b/pkg/executor/client/job.go @@ -674,7 +674,8 @@ func NewJobSpec(log *zap.SugaredLogger, options JobOptions) (*batchv1.Job, error secretEnvVars := append(envManager.PrepareSecrets(options.SecretEnvs, options.Variables), envManager.PrepareGitCredentials(options.UsernameSecret, options.TokenSecret)...) - tmpl, err := template.New("job").Parse(options.JobTemplate) + tmpl, err := template.New("job").Funcs(template.FuncMap{"vartypeptrtostring": testkube.VariableTypeString}). + Parse(options.JobTemplate) if err != nil { return nil, errors.Errorf("creating job spec from options.JobTemplate error: %v", err) } @@ -688,7 +689,8 @@ func NewJobSpec(log *zap.SugaredLogger, options JobOptions) (*batchv1.Job, error var job batchv1.Job jobSpec := buffer.String() if options.JobTemplateExtensions != "" { - tmplExt, err := template.New("jobExt").Parse(options.JobTemplateExtensions) + tmplExt, err := template.New("jobExt").Funcs(template.FuncMap{"vartypeptrtostring": testkube.VariableTypeString}). + Parse(options.JobTemplateExtensions) if err != nil { return nil, errors.Errorf("creating job extensions spec from template error: %v", err) } diff --git a/pkg/executor/containerexecutor/tmpl.go b/pkg/executor/containerexecutor/tmpl.go index c0f8d1232d6..cd1642c0eb2 100644 --- a/pkg/executor/containerexecutor/tmpl.go +++ b/pkg/executor/containerexecutor/tmpl.go @@ -39,7 +39,8 @@ func NewExecutorJobSpec(log *zap.SugaredLogger, options *JobOptions) (*batchv1.J secretEnvVars := append(envManager.PrepareSecrets(options.SecretEnvs, options.Variables), envManager.PrepareGitCredentials(options.UsernameSecret, options.TokenSecret)...) - tmpl, err := template.New("job").Parse(options.JobTemplate) + tmpl, err := template.New("job").Funcs(template.FuncMap{"vartypeptrtostring": testkube.VariableTypeString}). + Parse(options.JobTemplate) if err != nil { return nil, fmt.Errorf("creating job spec from executor template error: %w", err) } @@ -65,7 +66,8 @@ func NewExecutorJobSpec(log *zap.SugaredLogger, options *JobOptions) (*batchv1.J var job batchv1.Job jobSpec := buffer.String() if options.JobTemplateExtensions != "" { - tmplExt, err := template.New("jobExt").Parse(options.JobTemplateExtensions) + tmplExt, err := template.New("jobExt").Funcs(template.FuncMap{"vartypeptrtostring": testkube.VariableTypeString}). + Parse(options.JobTemplateExtensions) if err != nil { return nil, fmt.Errorf("creating job extensions spec from executor template error: %w", err) }