End to end functional test and automation framework

Declarative end to end functional testing (endly)

Declarative funtional testing for Go. GoDoc

This library is compatible with Go 1.12+

Please refer to CHANGELOG.md if you encounter breaking changes.

Motivation

An end to end testing is a methodology which comprehensively tests an application in the environment closely imitating production system with all network communication, user, datastore and other dependencies interaction.

It takes great length to manually prepare an application and its data for testing. And it can be serious bottleneck if this process is manual or relies on the 3rd party. Complex regression test plan execution and data organization can be yet additional challenge with hundreds business use cases to test.

While there are many great frameworks selection helping with an integration testing:

web UI integration testing:

or database integration testing:

or application build and deployment:

None of these tools on its own have a comprehensive end to end testing and automation capabilities. What is worst some of these tools are coupled with a particular frameworks or specific language.

Endly takes declarative approach to test an application written in any language. The testing weight moves towards input and desired application output definition. This framework provides an ability to maintain and operate on hundreds of use cases effectively and cohesively, on top of that it can also automate system, data and application preparation related tasks. Endly can easily orchestrate e2e testing process of n-tier distributed application where backend, middleware and front-end each uses different stack.

Some typical e2e testing tasks supported by endly:

  • Local or remote system preparation including all services required by the application (with or without docker).
  • Checking out the application code
  • Building and deploying the application (with or without docker).
  • Database and data preparation
  • Setting application state
  • Regression test execution (HTTP, REST, Selenium)
  • Data and application output verification (UI changes, transaction logs, database changes)

Introduction

Endly uses a generic workflow system to automate development and testing processes. Each process defines a sequence of task and actions. While a task act like a grouping element, an action does the actual job. For instance a regression test task; it may involve many small activities like sending HTTP request and checking response, validating database state, validating log records produced by the application, etc.

Various endly services expose a set of actions that can be directly invoked by a user-defined workflow.

Imagine an application build task, which may involve the following

  • code checkout
  • setting up SDK
  • setting build tools
  • setting environment
  • build an app

An endly workflow accomplishing this task may look like the following:

init:
  xxCredentials: ${env.HOME}/.secret/secret.json
  appPath: $WorkingDirectory(../)
  target:
    URL: ssh://127.0.0.1/
    credentials: localhost
pipeline:
  build-app:
    checkout:
      action: version/control:checkout
      origin:
        URL: https://github.com/some_repo/app
      dest:
        URL: $appPath
    set_sdk:
      set_jdk:
        action: sdk:set
        sdk: jdk:1.8
      set_build_runner:
        action: deployment:deploy
        appName: maven
        version: 3.5
      set_env:
        action: exec:run
        target: $target
        commands:
          - export XXX_CREDENTIALS=$xxCredentials
    get-schema:
      action: storage:copy
      source:
        URL: https://raw.githubusercontent.com/some_repo/db/schema.sql
      dest:
        URL: $appPath/schema.sql
    build:
      action: exec:run
      request: '@build.yaml'
       

@build.yaml

target: $target
commands:
  - echo 'building app'
  - cd $appPath
  - mvn clean test

In the following inline workflow, I have used

  • version/control service with checkout operation
  • sdk service with set operation
  • deployment service with deploy operation
  • storage service with copy operation
  • exec service with run operation

Endly exposes services in the RESTful manner, where each service provides a list of supported operation alongside with corresponding contracts. Any service request can be defined either directly within workflow or delegated to external request file using YAML or JSON format.

For instance to find out what request/response contract is supported by exec:run (which uses SSH session) you can simply run

endly -s=exec -a=run

The following command provide list of currently supported endly services

endly -s='*'

While the above build task example was a trivial workflow usage, the power of endly comes with

  • flexible workflow definition
  • workflow reusability
  • full stateful workflow execution control (i.e., defer task, on error task, loops, switch/case, concurrent action execution etc)
  • ability to organize regression workflow with thousands of use cases in a cohesive manner
  • ability to comprehensively control testing application state
  • flexible service architecture

Getting Started

Installation
Project generator

Good workflow and data organization is the key for success, e2e project generator is the great place to start.

Examples:

a) System preparation

For instance: the following define inline workflow to prepare app system services:

@system.yaml

tasks: $tasks
defaults:
  target: $serviceTarget
pipeline:
  destroy:
    stop-images:
      action: docker:stop
      images:
        - mysql
        - aerospike
  init:
    services:
      mysql:
        workflow: "service/mysql:start"
        name: mydb3
        version: $mysqlVersion
        credentials: $mysqlCredentials
        config: config/my.cnf
      aerospike:
        workflow: "service/aerospike:start"
        name: mydb4
        config: config/aerospike.conf

b) Application build and deployment

For instance: the following define inline workflow to build and deploy a test app: (you can easily build an app for standalone mode or in and for docker container)

With Dockerfile build file and docker compose

@app.yaml

tasks: $tasks
init:
- buildPath = /tmp/build/myapp/
- version = 0.1.0
defaults:
  app: myapp
  version: 0.1.0
  useRegistry: false
pipeline:
  build:
    init:
      action: exec:run
      target: $target
      commands:
      - if [ -e $buildPath ]; then rm -rf $buildPath; fi
      - mkdir -p $buildPath
    checkout:
      action: version/control:checkout
      origin:
        URL: https://github.com/adrianwit/dstransfer
      dest:
        URL: scp://${targetHost}:22/$buildPath
        credentials: localhost
    download:
      action: storage:copy
      source:
        URL: config/Dockerfile
      dest:
        URL: $buildPath
        credentials: localhost
    build-img:
      action: docker:build
      target: $target
      path: $buildPath
      '@tag':
        image: dstransfer
        username: adrianwit
        version: 0.1.0
  stop:
    target: $appTarget
    action: docker/ssh:composeDown
    source:
      URL: config/docker-compose.yaml
  deploy:
    target: $appTarget
    action: docker/ssh:composeUp
    runInBackground: true
    source:
      URL: config/docker-compose.yaml

As Standalone app (with predefined shared workflow)

@app.yaml

init:
  buildTarget:
    URL: scp://127.0.0.1/tmp/build/myApp/
    credentials: localhost
  appTarget:
    URL: scp://127.0.0.1/opt/myApp/
    credentials: localhost
  target:
    URL: scp://127.0.0.1/
    credentials: localhost
defaults:
  target: $target

pipeline:

  build:
    checkout:
      action: version/control:checkout
      origin:
        URL: ./../ 
        #or https://github.com/myRepo/myApp
      dest: $buildTarget
    set-sdk:
      action: sdk:set
      sdk: go:1.11
    build-app:
      action: exec:run
      commands:
        - cd /tmp/build/myApp/app
        - export GO111MODULE=on
        - go build myApp.go
        - chmod +x myApp
    deploy:
      mkdir:
        action: exec:run
        commands:
          - sudo rm -rf /opt/myApp/
          - sudo mkdir -p /opt/myApp
          - sudo chown -R ${os.user} /opt/myApp

      install:
        action: storage:copy
        source: $buildTarget
        dest: $appTarget
        expand: true
        assets:
          app/myApp: myApp
          config/config.json: config.json

  stop:
    action: process:stop
    input: myApp

  start:
    action: process:start
    directory: /opt/myApp
    immuneToHangups: true
    command: ./myApp
    arguments:
      - "-config"
      - "config.json"

c) Datastore/database creation

For instance: the following define inline workflow to create/populare mysql and aerospike database/dataset:

@datastore.yaml

pipeline:
  create-db:
    db3:
      action: dsunit:init
      scripts:
        - URL: datastore/db3/schema.ddl
      datastore: db3
      recreate: true
      config:
        driverName: mysql
        descriptor: "[username]:[password]@tcp(127.0.0.1:3306)/[dbname]?parseTime=true"
        credentials: $mysqlCredentials
      admin:
        datastore: mysql
        config:
          driverName: mysql
          descriptor: "[username]:[password]@tcp(127.0.0.1:3306)/[dbname]?parseTime=true"
          credentials: $mysqlCredentials
    db4:
      action: dsunit:init
      datastore: db4
      recreate: true
      config:
        driverName: aerospike
        descriptor: "tcp([host]:3000)/[namespace]"
        parameters:
          dbname: db4
          namespace: db4
          host: $serviceHost
          port: 3000
  populate:
    db3:
      action: dsunit:prepare
      datastore: db3
      URL: datastore/db3/dictionary
    db4:
      action: dsunit:prepare
      datastore: db4
      URL: datastore/db4/data
endly -r=datastore

d) Creating setup / verification dataset from existing datastore

For instance: the following define inline workflow to create setup dataset SQL based from on existing database

@freeze.yaml

pipeline:
  db1:
    register:
      action: dsunit:register
      datastore: db1
      config:
        driverName: bigquery
        credentials: bq
        parameters:
          datasetId: adlogs

    reverse:
      takeSchemaSnapshot:
        action: dsunit:dump
        datastore: db1
        # leave empty for all tables
        tables:
          - raw_logs
        #optionally target for target vendor if different that source  
        target: mysql 
        destURL: schema.sql
        
      takeDataSnapshot:
        action: dsunit:freeze
        datastore: db1
        destURL: db1/prepare/raw_logs.json
        omitEmpty: true
        ignore:
          - request.postBody
        replace:
          request.timestamp: $$ts
        sql:  SELECT request, meta, fee
                FROM raw_logs 
                WHERE requests.sessionID IN(x, y, z)
endly -r=freeze

e) Comparing SQL based data sets

endly -r=compare

@compare.yaml

pipeline:
  register:
    verticadb:
      action: dsunit:register
      datastore: db1
      config:
        driverName: odbc
        descriptor: driver=Vertica;Database=[database];ServerName=[server];port=5433;user=[username];password=[password]
        credentials: db1
        parameters:
          database: db1
          server: x.y.z.a
          TIMEZONE: UTC
    bigquerydb:
      action: dsunit:register
      datastore: db2
      config:
        driverName: bigquery
        credentials: db2
        parameters:
          datasetId: db2
  compare:
    action: dsunit:compare
    maxRowDiscrepancy: 10
    ignore:
      - field10
      - fieldN
    directives:
      "@numericPrecisionPoint@": 7
      "@coalesceWithZero@": true
      "@caseSensitive@": false
    
    source1:
      datastore: db1
      SQL: SELECT * 
           FROM db1.mytable 
           WHERE DATE(ts) BETWEEN '2018-12-01' AND '2018-12-02' 
           ORDER BY 1

    source2:
      datastore: db2
      SQL: SELECT *
           FROM db2.mytable
           WHERE DATE(ts) BETWEEN '2018-12-01' AND '2018-12-02'
           ORDER BY 1

f) Testing

For instance: the following define inline workflow to run test with selenium runner:

@test.yaml

defaults:
  target:
     URL: ssh://127.0.0.1/
     credentials: localhost
pipeline:
  init:
    action: selenium:start
    version: 3.4.0
    port: 8085
    sdk: jdk
    sdkVersion: 1.8
  test:
    action: selenium:run
    browser: firefox
    remoteSelenium:
      URL: http://127.0.0.1:8085
    commands:
      - get(http://play.golang.org/?simple=1)
      - (#code).clear
      - (#code).sendKeys(package main

          import "fmt"

          func main() {
              fmt.Println("Hello Endly!")
          }
        )
      - (#run).click
      - command: output = (#output).text
        exit: $output.Text:/Endly/
        sleepTimeMs: 1000
        repeat: 10
      - close
    expect:
      output:
        Text: /Hello Endly!/
endly -r=test

g) Stress testing:

The following define inline workflow that loads request and desired responses from data folder for stress testing.

@load.yaml

init:
  testEndpoint: z.myendoint.com
pipeline:
  test:
    tag: StressTest
    data:
      []Requests: '@data/*request.json'
      []Responses: '@data/*response.json'
    range: '1..1'
    template:
      info:
        action: print
        message: starting load testing 
      load:
        action: 'http/runner:load'
        threadCount: 3
        '@repeat': 100
        requests: $data.Requests
        expect:
          Responses: $data.Responses
      load-info:
        action: print
        message: 'QPS: $load.QPS: Response: min: $load.MinResponseTimeInMs ms, avg: $load.AvgResponseTimeInMs ms max: $load.MaxResponseTimeInMs ms'

Where data folder contains http request and desired responses i.e

@data/XXX_request.json

{
  "Method":"get",
  "URL":"http://${testEndpoint}/bg/?pixid=123"
}

@data/XXX_response.json

{
  "Code":200,
  "Body":"/some expected fragement/"
}
endly -r=load

h) Serverless e2e testing with cloud function

@test.yaml

defaults:
  credentials: am
pipeline:
  deploy:
    action: gcp/cloudfunctions:deploy
    '@name': HelloWorld
    entryPoint: HelloWorldFn
    runtime: go111
    source:
      URL: test/
  test:
    action: gcp/cloudfunctions:call
    logging: false
    '@name': HelloWorld
    data:
      from: Endly
  info:
    action: print
    message: $test.Result
  assert:
    action: validator:assert
    expect: /Endly/
    actual: $test.Result
  undeploy:
    action: gcp/cloudfunctions:delete
    '@name': HelloWorld

i) Serverless e2e testing with lambda function

@test.yaml

init:
  functionRole: lambda-loginfo-executor
  functionName: LoginfoFn
  codeZip: ${appPath}/loginfo/app/loginfo.zip
  privilegePolicy: ${parent.path}/privilege-policy.json
pipeline:
  deploy:
    build:
      action: exec:run
      target: $target
      errors:
        - ERROR
      commands:
        - cd ${appPath}loginfo/app
        - unset GOPATH
        - export GOOS=linux
        - export GOARCH=amd64
        - go build -o loginfo
        - zip -j loginfo.zip loginfo

    setupFunction:
      action: aws/lambda:deploy
      credentials: $awsCredentials
      functionname: $functionName
      runtime:  go1.x
      handler: loginfo
      code:
        zipfile: $LoadBinary(${codeZip})
      rolename: lambda-loginfo-executor
      define:
        - policyname: s3-mye2e-bucket-role
          policydocument: $Cat('${privilegePolicy}')
      attach:
        - policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

    setupAPI:
      action: aws/apigateway:deployAPI
      credentials: aws
      '@name': loginfoAPI
      resources:
        - path: /{proxy+}
          methods:
            - httpMethod: ANY
              functionname: $functionName
    sleepTimeMs: 10000

  test:
    action: rest/runner:send
    URL: ${setupAPI.EndpointURL}oginfo
    method: post
     '@request':
      region: ${awsSecrets.Region}
      URL: s3://mye2e-bucket/folder1/
    expect:
      Status: ok
      FileCount: 2
      LinesCount: 52

To see Endly in action,

End to end testing examples

In addition a few examples of fully functioning applications are included. You can build, deploy and test them end to end all with endly.

  1. Web Service

    • Reporter - a pivot table report builder.
      • Test with Rest Runner
      • Data Preparation and Validation (mysql)
  2. User Interface

    • SSO - user registration and login application.
      • Test with Selenium Runner
      • Test with HTTP Runner
      • Data Preparation and Validation (aersopike)
      • Web Content validation
      • Mocking 3rd party REST API with http/endpoint service
  3. Extract, Transform and Load (ETL)

    • Transformer - datastore to datastore myApp (i.e. aerospike to mysql)
      • Test with Rest Runner
      • Data Preparation and Validation (aersopike, mysql)
  4. Runtime - simple http request event logger

    • Logger
      • Test with HTTP Runner
      • Log Validation
  5. Serverless - serverless (lambda/cloud function/dataflow)

Documentation

@run.yaml

target:
  URL: "ssh://127.0.0.1/"
  credentials: localhost
systemPaths:
  - /usr/local/go/bin
commands:
  - go version
  - echo $GOPATH

External resources

License

The source code is made available under the terms of the Apache License, Version 2, as stated in the file LICENSE.

Individual files may be made available under their own specific license, all compatible with Apache License, Version 2. Please see individual files for details.

TODO

  • documentation improvements
  • command executor with os/exec.Command
  • gcp/containers integration
  • gcp/cloudfunctions viant/afs integration
  • ufd self describing meta data
  • viant/afs docker connector

Contributing to endly

endly is an open source project and contributors are welcome!

Credits and Acknowledgements

Library Author: Adrian Witas

Comments
  • Custom stdin

    Custom stdin

    Hello!

    First of all thanks for this awesome tool, it's really useful!

    There's a feature that I think would be really useful: being able to set a custom stdin for a command / execution.

    For example: I want to test the password change feature of the app I'm testing. It's through the CLI and it asks for the old password and the new one twice

    I'd be nice to have something like this:

      test-change-password:
        action: exec:run
        target: $appTarget
        comment: This will change the password
        commands:
          - command: ./app passwd
            stdin:
              - oldpwd
              - newpwd
              - newpwd
    

    It would be even better to be able to set custom waits between stdin entries!

    Thanks!!

  • Error running elogger tests

    Error running elogger tests

    I'm trying to run the elogger tests via endly -r=run but it fails in the log validation stage for some reason.

    `[run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdin] rm -f /opt/elogger/logs/* [run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdout]

    [run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdout]

    [run[app]run|regresion[Prepare] exec.run] [run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdin] cd / [run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdout]

    [run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdin] rm -f /opt/elogger/logs/* [run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdout]

    [run[app]run|regresion[Prepare]exec.run 127.0.0.1:22 stdout]

    [run[app]run|regresion[Prepare] validator/log.listen] [run[app]run|regresion[Prepare]validator/log.listen unsupported scheme /opt/elogger/logs at validator/log.listen error] [run[app]run|regresion[Prepare]validator/log.listen regresion_Prepare: unsupported scheme /opt/elogger/logs at v error] regresion_Prepare: unsupported scheme /opt/elogger/logs at validator/log.listen at workflow.run [run[app]run|regresion[Prepare]validator/log.listen run: regresion_Prepare: unsupported scheme /opt/elogger/logs error] run: regresion_Prepare: unsupported scheme /opt/elogger/logs at validator/log.listen at workflow.run [STATUS: FAILED `

  • Build from source documentation needs to be updated

    Build from source documentation needs to be updated

    Trying to build endly with an older version of go produces

    $ go build
    build github.com/viant/endly/endly: cannot load embed: malformed module path "embed": missing dot in first path element
    

    Embed was first released in 1.16 (I think) https://golang.org/doc/go1.16#library-embed So, endly can no longer be built by versions of Go older than 1.16 (I get that versions older than that may not be supported, but the documentation says 1.11 or later, which is now incorrect)

  • Tar archive for osx seems corrupted

    Tar archive for osx seems corrupted

    Tried opening the archive available in the release section but neither tar nor macos recognizes that it is a valid tar.gz.

    ➜  Downloads    tar -xvzf endly_osx_0.44.0.tar.gz
    
    tar: Unrecognized archive format
    tar: Error exit delayed from previous errors.
  • checkError not failing

    checkError not failing

    Hello gentlemen,

    in the docs there is an example of a workflow failing based on command exit code with checkError:

    pipeline:
      package:
        action: exec:run
        target: $target
        checkError: true
        commands:
          - whoami
          - /bin/false
    

    When i try it out, everything seems to pass without errors, is this a bug or an i misinterpreting the docs?

    [x[package]                                                                                                                                                                                              exec.run]
    [x[package]exec.run pja@localhost:22                                                                                                                                                                        stdin]
    whoami
    [x[package]exec.run pja@localhost:22                                                                                                                                                                       stdout]
    pja
    [x[package]exec.run pja@localhost:22                                                                                                                                                                        stdin]
    /bin/false
    [x[package]exec.run pja@localhost:22                                                                                                                                                                       stdout]
    
    [STATUS: SUCCESS   
    
  • Command execution no SSH

    Command execution no SSH

    As the title says, it would be really useful to be able to execute commands on the host without needing an SSH connection (e.g. using os/exec.Command)

  • Test failed with go mod

    Test failed with go mod

    Hello, I'm using go mod feature and I have some trouble, when I'm using viant/endly. Indeed, this is a simple Dockerfile :

    FROM golang:1.11
    
    ENV GO111MODULE on
    RUN mkdir -p ${GOPATH}/src/github.com/viant/
    WORKDIR ${GOPATH}/src/github.com/viant
    RUN git clone https://github.com/viant/endly
    WORKDIR ${GOPATH}/src/github.com/viant/endly
    RUN go mod init
    RUN go mod tidy
    RUN go test -coverprofile=cover.out
    

    Expected output

    PASS
    coverage: XX% of statements
    ok      github.com/viant/endly       XXXs
    

    Output

    # github.com/viant/endly [github.com/viant/endly.test]
    ./context.go:297: assignment mismatch: 2 variables but 1 values
    ./manager.go:98: assignment mismatch: 2 variables but 1 values
    FAIL	github.com/viant/endly [build failed]
    The command '/bin/sh -c go test -coverprofile=cover.out' returned a non-zero code: 2
    

    Possible fix

    • Fix a version of github.com/satori/go.uuid, when this function uuid.NewV1() return UUID and error
    • Update the code with UUID := uuid.NewV1() and get the updated version of github.com/satori/go.uuid
  • Fix validation assert rolling logs

    Fix validation assert rolling logs

    Update to fix issue with locating recording in rolling log by key. All rolled logs are being loaded into memory, however, the issue is that endly only searches through the first log and does not check any other logs for a matching key. Assuming this change is accepted please create a new release binary.

  • Problem with exec:run

    Problem with exec:run

    Hello gentlemen,

    i'm a late newcomer to this tool, and i'm hitting the wall from the start, so please have patience with me if this shows to be a beginners mistake :smile:

    So i'm just trying to execute a hello world pipeline:

    pipeline:
      task_init:
        action_hello:
          action: print
          message: hello world
      task_test:
        run_action:
          action: exec:run
          commands:
            - /usr/bin/hostname
    

    with unprivileged user, id_rsa key is in place, ssh localhost works, but when i try endly on that yaml, it hangs on run_action:

    [run[action_hello]                                                                                                                                                                                 workflow.print]
    hello world
    [run[run_action]                                                                                                                                                                                         exec.run]
    ^C
    

    I've tried with both the binary release and by building from master, with same result. Also i've been trying to reread the docs to see what i'm doing wrong, but i can't figure it out.

    In the logs, i see successful authentication and session:

    May 20 17:15:07 test.local.lan sshd[389240]: Accepted publickey for pja from ::1 port 45506 ssh2: RSA SHA256
    May 20 17:15:07 test.local.lan systemd-logind[1063]: New session 72 of user pja.
    May 20 17:15:07 test.local.lan systemd[1]: Started Session 72 of user pja.
    May 20 17:15:07 test.local.lan sshd[389240]: pam_unix(sshd:session): session opened for user pja by (uid=0)
    May 20 17:15:07 test.local.lan PackageKit[1663]: search-file transaction /25790_dddaaedd from uid 1000 finished with success after 59ms
    

    What am i missing here? :smile:

  • Fix extract required

    Fix extract required

    Specifying a capture group like so would lead to a nil pointer panic:

    extract:
      key: valueExists
      regexpr: "running: ok"
      required: true
    

    I reworked the code to use the zero match (the entire match) if no capture group is specified.

  • Bump gopkg.in/yaml.v2 from 2.2.2 to 2.2.8

    Bump gopkg.in/yaml.v2 from 2.2.2 to 2.2.8

    Bumps gopkg.in/yaml.v2 from 2.2.2 to 2.2.8.

    Commits
    • 53403b5 Optimize cases with long potential simple_keys (#555)
    • 1f64d61 Fix issue in simple_keys improvements (#548)
    • a95acef Update travis config to use latest go versions (#540)
    • 36babc3 Port stale simple_keys fix to v2 (#543)
    • 770b8da Fix Decorder doc typo (#494)
    • 1ed5951 Add Go 1.10-13 to travis setup.
    • f90ceb4 Fix check for non-map alias merging in v2 (#529)
    • 970885f Trivial style tuning on last change.
    • f221b84 Improve heuristics preventing CPU/memory abuse (#515)
    • bb4e33b Add logic to catch cases of alias abuse.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • error on go build endly.go

    error on go build endly.go

    `go build endly.go ░▒▓ 2 ✘ at 21:59:27 

    golang.org/x/sys/unix

    ../../../go/pkg/mod/golang.org/x/[email protected]/unix/syscall_darwin.1_13.go:29:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.1_13.go:27:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.1_13.go:40:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:28:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:43:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:59:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:75:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:90:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:105:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:121:3: //go:linkname must refer to declared function or variable ../../../go/pkg/mod/golang.org/x/[email protected]/unix/zsyscall_darwin_amd64.go:121:3: too many errors ` Follow the install Document, try to go build endly.go, but not success~

🚀🌏 Orbital is a simple end-to-end testing framework for Go

Orbital is a test framework which enables a developer to write end to end tests just like one would writing unit tests. We do this by effectively copying the testing.T API and registering tests to be run periodically on a configured schedule.

Nov 18, 2022
End-to-end HTTP and REST API testing for Go.

httpexpect Concise, declarative, and easy to use end-to-end HTTP and REST API testing for Go (golang). Basically, httpexpect is a set of chainable bui

Jan 5, 2023
A simple and expressive HTTP server mocking library for end-to-end tests in Go.

mockhttp A simple and expressive HTTP server mocking library for end-to-end tests in Go. Installation go get -d github.com/americanas-go/mockhttp Exa

Dec 19, 2021
Expressive end-to-end HTTP API testing made easy in Go

baloo Expressive and versatile end-to-end HTTP API testing made easy in Go (golang), built on top of gentleman HTTP client toolkit. Take a look to the

Dec 13, 2022
Rr-e2e-tests - Roadrunner end-to-end tests repository
Rr-e2e-tests - Roadrunner end-to-end tests repository

RoadRunner end-to-end plugins tests License: The MIT License (MIT). Please see L

Dec 15, 2022
Flugel Test Documentation for steps to run and test the automatio
Flugel Test Documentation for steps to run and test the automatio

Flugel Test Documentation Documentation for steps to run and test the automation #Test-01 1 - Local Test Using Terratest (End To End) 1- By runing " t

Nov 13, 2022
This repository includes consumer driven contract test for provider, unit test and counter api.

This repository includes consumer driven contract test for provider, unit test and counter api.

Feb 1, 2022
go-test-trace is like go test but it also generates distributed traces.
go-test-trace is like go test but it also generates distributed traces.

go-test-trace go-test-trace is like go test but it also generates distributed traces. Generated traces are exported in OTLP to a OpenTelemetry collect

Jan 5, 2023
Test-assignment - Test assignment with golang
Test-assignment - Test assignment with golang

test-assignment We have a two steam of data and we need to save it in the map: I

Jan 19, 2022
Playwright for Go a browser automation library to control Chromium, Firefox and WebKit with a single API.
Playwright for Go a browser automation library to control Chromium, Firefox and WebKit with a single API.

?? Playwright for API reference | Example recipes Playwright is a Go library to automate Chromium, Firefox and WebKit with a single API. Playwright is

Jan 1, 2023
A Devtools driver for web automation and scraping

Overview Documentation | API reference Rod is a high-level driver directly based on DevTools Protocol. It's designed for web automation and scraping.

Dec 30, 2022
Ritchie CLI is an open-source tool that allows to create, store and share any kind of automation, executing them through command lines, to run operations or start workflows ⚙️ 🖥 💡
Ritchie CLI is an open-source tool that allows to create, store and share any kind of automation, executing them through command lines, to run operations or start workflows ⚙️ 🖥 💡

Table of contents 1. About 2. Getting Started i. Installation ii. Initialize rit locally iii. Add your first formulas repository iv. Run the Hello Wor

Dec 29, 2022
Full-featured test framework for Go! Assertions, mocking, input testing, output capturing, and much more! 🍕
Full-featured test framework for Go! Assertions, mocking, input testing, output capturing, and much more! 🍕

testza ?? Testza is like pizza for Go - you could life without it, but why should you? Get The Module | Documentation | Contributing | Code of Conduct

Dec 10, 2022
http integration test framework

go-hit hit is an http integration test framework written in golang. It is designed to be flexible as possible, but to keep a simple to use interface f

Dec 29, 2022
Microservice Test Framework

This Microservice Test Framework (MTF) allows in simple way to mock service dependencies and setup docker test environment comprehensive.

Nov 22, 2022
Simple HTTP integration test framework for Golang

go-itest Hassle-free REST API testing for Go. Installation go get github.com/jefflinse/go-itest Usage Create tests for your API endpoints and run the

Jan 8, 2022
A simple yet intuitive golang unit test framework.

gotest Intuitive and simple golang testing framework which helps in writing unit tests in a way which improves the readability of the test. Here is an

Jan 1, 2022
Testy is a Go test running framework designed for Gametime's API testing needs.

template_library import "github.com/gametimesf/template_library" Overview Index Overview Package template_library is a template repository for buildin

Jun 21, 2022
Test your command line interfaces on windows, linux and osx and nodes viá ssh and docker

Commander Define language independent tests for your command line scripts and programs in simple yaml files. It runs on windows, osx and linux It can

Dec 17, 2022