func (Executor) Run(ctx context.Context, step venom.TestStep) (interface{}, error) {
	var e Executor
	if err := mapstructure.Decode(step, &e); err != nil {
		return nil, err
	}
	if e.Path == "" {
		return nil, fmt.Errorf("Invalid path")
	}
	start := time.Now()
	workdir := venom.StringVarFromCtx(ctx, "venom.testsuite.workdir")
	result, errr := e.readfile(workdir)
	if errr != nil {
		result.Err = errr.Error()
	}
	elapsed := time.Since(start)
	result.TimeSeconds = elapsed.Seconds()
	return result, nil
}
Run execute TestStep of type exec
package readfile
import (
	"context"
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"path/filepath"
	"strings"
	"time"
	"github.com/mattn/go-zglob"
	"github.com/mitchellh/mapstructure"
	"github.com/ovh/venom"
)
const Name = "readfile"
func New() venom.Executor {
	return &Executor{}
}
type Executor struct {
	Path string `json:"path,omitempty" yaml:"path,omitempty"`
}
type Result struct {
	Content     string            `json:"content,omitempty" yaml:"content,omitempty"`
	ContentJSON interface{}       `json:"contentjson,omitempty" yaml:"contentjson,omitempty"`
	Err         string            `json:"error" yaml:"error"`
	TimeSeconds float64           `json:"timeSeconds,omitempty" yaml:"timeSeconds,omitempty"`
	Md5sum      map[string]string `json:"md5sum,omitempty" yaml:"md5sum,omitempty"`
	Size        map[string]int64  `json:"size,omitempty" yaml:"size,omitempty"`
	ModTime     map[string]int64  `json:"modtime,omitempty" yaml:"modtime,omitempty"`
	Mod         map[string]string `json:"mod,omitempty" yaml:"mod,omitempty"`
}
func (Executor) ZeroValueResult() interface{} {
	r := Result{
		Md5sum:  make(map[string]string),
		Size:    make(map[string]int64),
		ModTime: make(map[string]int64),
		Mod:     make(map[string]string),
	}
	return r
}
func (Executor) GetDefaultAssertions() *venom.StepAssertions {
	return &venom.StepAssertions{Assertions: []string{"result.err ShouldBeEmpty"}}
}