Atomkraft - Lightweight e2e testing for cosmos blockchains

Overview

Atomkraft

End-to-end testing of Cosmos blockchains should be easy and reproducible!

Atomkraft is a python package that provides you with a thin layer for executing Informal traces against a Cosmos blockchain.

Atomkraft offers the following features:

Our principle design decision was to make Atomkraft as thin as possible and make it easy to hack, because every blockchain comes with its own quirks, APIs, and endpoints. Atomkraft does not depend on complex verification/testing tools, though advanced tools such as Apalache can be easily integrated into the testing workflow with Atomkraft. This approach proved itself in several audits, where we had to deal with Cosmos SDK and Ethereum Virtual Machine (and even both at the same time!).

The diagram below shows the data flow in an Atomkraft setup:

Atomkraft workflow

Examples

Check how we test Delegation and transfers in Cosmos SDK.

Install

To build atomkraft, run the following commands:

git clone [email protected]:informalsystems/atomkraft.git
cd atomkraft
make build && make install
Comments
  • Atomkraft with provenance binary (help needed)

    Atomkraft with provenance binary (help needed)

    Hi there,

    Trying to setup atomkraft to run with the provenance binary. I have tried few different things but not getting past the following error:

    👉  atomkraft init provenance-e2e
    👉 cd provenance-e2e
    👉 atomkraft chain testnet
    node id: 655ea20acf1ad2c8db56b1874f3142892375d9b0
    Using mainnet defaults
    Genesis file created: .atomkraft/validator_nodes/val_q312_lth/node_0/config/genesis.json
    Writing app config to: .atomkraft/validator_nodes/val_q312_lth/node_0/config/app.toml ... Done.
    Writing tendermint config to: .atomkraft/validator_nodes/val_q312_lth/node_0/config/config.toml ... Done.
    Writing client config to: .atomkraft/validator_nodes/val_q312_lth/node_0/config/client.toml ... Done.
    Expecting value: line 1 column 1 (char 0)
    Exit: 1
    

    chain.toml looks like this:

    chain_id = "testnet"
    validators = 3
    accounts = 2
    binary = "../provenance/build/provenanced"
    hrp_prefix = "provenance"
    denom = "hash"
    coin_type = 505
    
    [config_node.app]
    minimum-gas-prices = "1905hash"
    api = { enable = true, swagger = true, enabled-unsafe-cors = true }
    rosetta = { enable = false }
    
    [config_node.config]
    instrumentation = { prometheus = false }
    p2p = { addr_book_strict = false, allow_duplicate_ip = true }
    
    [config_genesis.app_state.gov]
    voting_params = { voting_period = "600s" }
    
    [config_genesis.app_state.mint]
    minter = { inflation = "0.300000000000000000" }
    

    Are there any other logs generated besides above? 😕

    opened by llama-del-rey 9
  • Tutorial updates

    Tutorial updates

    • included simulation in the tutorial
    • used a more meaningful predicate to illustrate sampling

    Merge together with: Modelator#280

    Remaining issues:

    • [x] Make sure that there are no fees in the execution (since fees are not modelled) : Issue #148

    Blocking:

    • [ ] Next release of modelator
    • [ ] Bump modelator version
    user support 
    opened by ivan-gavran 6
  • Small issues with Atomkraft tutorial

    Small issues with Atomkraft tutorial

    Testing the existing Atomkraft tutorial, I found the following two small issues:

    • upon installing (running pip install --upgrade atomkraft), I get the following error:
    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    copier 6.1.0 requires packaging>=21.0, but you have packaging 20.9 which is incompatible.
    

    The installation process goes through, but it is a bad feeling to see the Error message

    • copying in the .md files (when pressing the copy symbol) copies too much (also the output)
    bug 
    opened by ivan-gavran 4
  • Testnet creation fails non-deterministically

    Testnet creation fails non-deterministically

    I have the Atomkraft project configured correctly, with all binaries and everything. This is the CosmWasm counter example. Most of the time testing works fine using this example; but from time to time it fails like that (from a pytest execution):

    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/modelator/pytest/decorators.py:78: in <dictcomp>
        arg: step[arg] if arg in step else request.getfixturevalue(arg)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/_pytest/fixtures.py:554: in getfixturevalue
        fixturedef = self._get_active_fixturedef(argname)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/_pytest/fixtures.py:573: in _get_active_fixturedef
        self._compute_fixture_value(fixturedef)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/_pytest/fixtures.py:659: in _compute_fixture_value
        fixturedef.execute(request=subrequest)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/_pytest/fixtures.py:1057: in execute
        result = ihook.pytest_fixture_setup(fixturedef=self, request=request)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/pluggy/_hooks.py:265: in __call__
        return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/pluggy/_manager.py:80: in _hookexec
        return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/_pytest/fixtures.py:1111: in pytest_fixture_setup
        result = call_fixture_func(fixturefunc, request, kwargs)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/_pytest/fixtures.py:883: in call_fixture_func
        fixture_result = next(generator)
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/atomkraft/chain/pytest.py:13: in testnet
        testnet.oneshot()
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/atomkraft/chain/testnet.py:214: in oneshot
        self.prepare()
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/atomkraft/chain/testnet.py:182: in prepare
        node.add_key(self.validators[i])
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/atomkraft/chain/node.py:112: in add_key
        stdout, stderr = self._execute(
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    
    self = <atomkraft.chain.node.Node object at 0x121a0f850>
    args = ['keys', 'add', 'validator-0', '--recover', '--keyring-backend', 'test', ...]
    
        def _execute(self, args, *, stdin: bytes | None = None, stdout=None, stderr=None):
            final_args = f"{self.binary} --home {self.home_dir}".split() + args
            # print(" ".join(final_args))
            stdin_pipe = None if stdin is None else PIPE
            with Popen(final_args, stdin=stdin_pipe, stdout=stdout, stderr=stderr) as p:
                out, err = p.communicate(input=stdin)
                rt = p.wait()
                if rt != 0:
    >               raise RuntimeError(f"Non-zero return code {rt}\n{err.decode()}")
    E               RuntimeError: Non-zero return code 1
    E               Error: aborted
    E               Usage:
    E                 junod keys add <name> [flags]
    E               
    E               Flags:
    E                     --account uint32           Account number for HD derivation
    E                     --algo string              Key signing algorithm to generate keys for (default "secp256k1")
    E                     --coin-type uint32         coin type number for HD derivation (default 118)
    E                     --dry-run                  Perform action, but don't add key to local keystore
    E                     --hd-path string           Manual HD Path derivation (overrides BIP44 config)
    E                 -h, --help                     help for add
    E                     --index uint32             Address index number for HD derivation
    E                 -i, --interactive              Interactively prompt user for BIP39 passphrase and mnemonic
    E                     --ledger                   Store a local reference to a private key on a Ledger device
    E                     --multisig strings         List of key names stored in keyring to construct a public legacy multisig key
    E                     --multisig-threshold int   K out of N required signatures. For use in conjunction with --multisig (default 1)
    E                     --no-backup                Don't print out seed phrase (if others are watching the terminal)
    E                     --nosort                   Keys passed to --multisig are taken in the order they're supplied
    E                     --pubkey string            Parse a public key in JSON format and saves key info to <name> file.
    E                     --recover                  Provide seed phrase to recover existing key instead of creating
    E               
    E               Global Flags:
    E                     --home string              The application home directory (default "/Users/andrey/.juno")
    E                     --keyring-backend string   Select keyring's backend (os|file|test) (default "test")
    E                     --keyring-dir string       The client Keyring directory; if omitted, the default 'home' directory will be used
    E                     --log_format string        The logging format (json|plain) (default "plain")
    E                     --log_level string         The logging level (trace|debug|info|warn|error|fatal|panic) (default "info")
    E                     --output string            Output format (text|json) (default "text")
    E                     --trace                    print out full stack trace on errors
    
    ../../../Library/Caches/pypoetry/virtualenvs/atomkraft-9j0E0YDD-py3.10/lib/python3.10/site-packages/atomkraft/chain/node.py:238: RuntimeError
    

    Not sure what causes that, but would be nice to investigate.

    bug 
    opened by andrey-kuprianov 4
  • docs(tutorial): update `transfer` tutorial

    docs(tutorial): update `transfer` tutorial

    Closes #148

    A rebased version of #147

    • included simulation in the tutorial
    • used a more meaningful predicate to illustrate sampling

    Merge together with: Modelator#288

    Remaining issues:

    • [x] Make sure that there are no fees in the execution (since fees are not modelled) : Issue #148

    Blocking:

    • [ ] Next release of modelator
    • [ ] Bump modelator version
    user support 
    opened by ivan-gavran 3
  • No fees by default

    No fees by default

    For our testnets, we should have no fees by default since all our models for now are not modelling fees. (Alternatively, we should model fees in the models). This is important for PR #147 .

    opened by ivan-gavran 3
  • Running cosmwasm example

    Running cosmwasm example

    Hello, I have downloaded atomkraft (dev branch). I succeeded to install python3.10 alongside with python3.8 (default version on my ubuntu 20). I compiled project with poetry, following instructions in CONTRIBUTING.md. I have a problem to run cosmwasm example, which is placed inside the project. I tried first step pip install -U atomkraft but it fails with

    Defaulting to user installation because normal site-packages is not writeable Collecting atomkraft Using cached atomkraft-0.0.10-py3-none-any.whl (38 kB) Collecting case-converter<2.0.0,>=1.1.0 Using cached case_converter-1.1.0-py3-none-any.whl (14 kB) Collecting terra-sdk<4.0.0,>=3.0.1 Using cached terra_sdk-3.0.1-py3-none-any.whl (124 kB) Collecting terra-proto<3.0.0,>=2.1.0 Using cached terra_proto-2.1.0-py3-none-any.whl (132 kB) Collecting tomlkit<0.12.0,>=0.11.1 Using cached tomlkit-0.11.4-py3-none-any.whl (35 kB) Collecting modelator<0.7.0,>=0.6.2 Using cached modelator-0.6.2-py3-none-any.whl (51 kB) Collecting tabulate<0.9.0,>=0.8.9 Using cached tabulate-0.8.10-py3-none-any.whl (29 kB) Collecting websockets<11.0,>=10.3 Using cached websockets-10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (111 kB) Collecting pytest-reportlog<0.2.0,>=0.1.2 Using cached pytest_reportlog-0.1.2-py3-none-any.whl (5.6 kB) Collecting hdwallet<3.0.0,>=2.1.1 Using cached hdwallet-2.1.1-py3-none-any.whl (68 kB) Collecting copier<7.0.0,>=6.1.0 Using cached copier-6.1.0-py3-none-any.whl (34 kB) Collecting GitPython<4.0.0,>=3.1.27 Using cached GitPython-3.1.27-py3-none-any.whl (181 kB) Collecting typer[all]<0.7.0,>=0.6.1 Using cached typer-0.6.1-py3-none-any.whl (38 kB) Collecting bip-utils<3.0.0,>=2.3.0 Using cached bip_utils-2.6.1.tar.gz (329 kB) Preparing metadata (setup.py) ... error error: subprocess-exited-with-error

    × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [1 lines of output] ERROR: Can not execute setup.py since setuptools is not available in the build environment. [end of output]

    note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed

    × Encountered error while generating package metadata. ╰─> See above for output.

    note: This is an issue with the package mentioned above, not pip. hint: See above for details.

    I don't know how to run an example, using my local compiled version.

    opened by djordjepesic1991 3
  • Improve the transfer tutorial

    Improve the transfer tutorial

    At the moment, the transfer tutorial is the best place for seeing how atomkraft works.

    However, it should be updated with respect to recent changes (e.g., not downloading model checkers directly, but through atomkraft etc.).

    Overall goal is to have it as a simple tutorial in which everything is done through atomkraft..

    user support 
    opened by ivan-gavran 3
  • Simplify and automate `atomkraft init` user interaction

    Simplify and automate `atomkraft init` user interaction

    Currently, atomkraft init operates via delegating many tasks to other programs, in particular poetry init, which asks the user lots of irrelevant questions. I believe the following should be done:

    • the internals of all those commands should be hidden from the user
    • all input/output should either come from directly from us, or be translated. No interaction should happen directly with the other, subordinate program.
    • the process should be automated to the maximal degree possible. In particular, the user should not be forced to answer whether they want to define dependencies/dev-dependencies interactively.
    opened by andrey-kuprianov 3
  • CLI: Generate Reactor Stub

    CLI: Generate Reactor Stub

    Context: Reactor

    Once the user has a TLA+ model, they need to write a reactor: a set of Python functions connecting the actions of the model to executions of the code.

    The task is to generate a stub for the reactor.

    Task

    The command that needs to be implemented is atomkraft reactor <action-list> <model> [<reactor-stub-file>] where

    • action-list is a list of actions for which to generate stubs
    • model is the TLA model for which we are implementing a reactor
    • reactor-stub-file is a path at which the reactor file should be created. If omitted, a default path is used.

    The stub should include:

    • a stub for the testnet initialization function
    @pytest.fixture(scope="session")
    def testnet():
      chain_id = "test-cw"
      binary = <binary> # as setup in the init command
      denom = "stake"
      prefix = "juno" #TODO: clarify
      coin_type = 118 # TODO: clarify
    
      genesis_config = {
          "app_state.gov.voting_params.voting_period": "600s",
          "app_state.mint.minter.inflation": "0.300000000000000000",
      }
    
      node_config = {
          "config/app.toml": {
              "api.enable": True,
              "api.swagger": True,
              "api.enabled-unsafe-cors": True,
              "minimum-gas-prices": f"0.10{denom}",
              "rosetta.enable": False,
          },
          "config/config.toml": {
              "instrumentation.prometheus": False,
              "p2p.addr_book_strict": False,
              "p2p.allow_duplicate_ip": True,
          },
      }
    
      testnet = Testnet(
          chain_id,
          n_validator=3,
          n_account=3,
          binary=binary,
          denom=denom,
          prefix=prefix,
          coin_type=coin_type,
          genesis_config=genesis_config,
          node_config=node_config,
          account_balance=10**26,
          validator_balance=10**16,
      )
    
      testnet.oneshot()
      time.sleep(10)
      yield testnet
      time.sleep(2)
    
    • a stub for the state function
      @pytest.fixture
      def state():
          pass
    
    
    • for each action act from action-list, a stub for the step function connecting the abstract action to the code execution.
      @step("act")
      def act_step(testnet, state, var1, var2,..., vark):
          pass
    

    where var1, var2,...,vark are all the variables of the model, state is the state provided by the function state, and testnet is the blockchain client provided by the function testnet

    Finally, the stub should contain comments with guidance on how to use the stub.

    opened by ivan-gavran 3
  • refactor(cli): use `jinja` over `copier`

    refactor(cli): use `jinja` over `copier`

    Closes #166

    • removes git and copier dependency
    • includes templates in atomkraft package
    • atomkraft init works offline now
    • atomkraft init uses correct templates on PR workflows

    ~Otherwise, atomkraft init stays virtually the same.~

    Since this removes git dependency, init doesn't initialize a git repo anymore.

    • [x] added cli test
    enhancement 
    opened by rnbguy 2
  • `atomkraft init` should generate a hello world project instead of an empty one

    `atomkraft init` should generate a hello world project instead of an empty one

    Conventionally any project initialization command generates a bare minimum hello-world or 2+3=5 project.

    It would be great if atomkraft init adopts this culture.

    opened by rnbguy 0
  • `atomkraft init` should generate a `.gitignore` file

    `atomkraft init` should generate a `.gitignore` file

    Since an atomkraft project generates many artifacts, the generated project should contain an appropriate .gitignore.

    We don't need GitPython dependency. We can write the file at the project root.

    Note that atomkraft still doesn't initialize the project as a git repo. The current workflow of creating a git atomkraft project repo is,

    atomkraft init my_project
    cd my_project
    git init .
    
    enhancement 
    opened by rnbguy 0
  • can't run `atomkraft` without `.atomkraft` directory

    can't run `atomkraft` without `.atomkraft` directory

    The project directory logic includes .atomkraft/config.toml file.

    https://github.com/informalsystems/atomkraft/blob/e18c3ab78f04d7431180aab82495e390cd7dddb1/atomkraft/utils/project.py#L17-L27

    This creates problems when someone tries to git-clone a project and execute atomkraft in it.

    You are outside of Atomkraft project
    ...
    

    I suggest checking only for a valid atomkraft.toml in a directory.

    bug 
    opened by rnbguy 0
  • Improve location of test files for `test` command

    Improve location of test files for `test` command

    From https://github.com/informalsystems/atomkraft/pull/199#discussion_r1032401187 :

    We always create a single test_* file in tests directory for each test trace ... call. So for a directory passed as a trace, it will create a tests/example_<TS>/test_example.py - a directory containing a single test.

    Why not:

    • put single test_*.py files always in tests/ directory?
    • Or, we replace tests/example_<TS>/test_example.py with tests/example/test_example_<TS>.py. But then we should do the same for individual traces?

    I [Rano] like (1) if we don't care about tests/test_*py. I like (2) because it organizes the tests directory.

    opened by hvanz 0
  • Support for custom modules in Atomkraft

    Support for custom modules in Atomkraft

    Currently Atomkraft is having implemented GRPC broadcasting only for Cosmos SDK modules and x/wasmd module trough terra_sdk. That is, the mechanism of easily creating tx and broadcasting them to the chain works only for modules covered in this package.

    In audits, we will mostly have the need to audit and create and execute tests with Atomkraft for custom built modules and will need the fastest way to cover some module with tests. If an auditor could think only of parsing the traces and creating test assertions during the Atomkraft adaptation for a project, it would be great (we need to be as fast as possible).

    Currently the audit team will use the CLI binary in order to create and execute tests for custom modules build for other chains, but it would be nice if there is a way to:

    • easily define new Msg type or query and use the existing GRPC broadcasting or
    • use CLI, but without the need to worry about details around building the commands that will be sent to the chain.
    enhancement 
    opened by dalmirel 0
  • ci(test): faster mdx ci runtime

    ci(test): faster mdx ci runtime

    • Runs jobs in docker container https://docs.github.com/en/actions/using-jobs/running-jobs-in-a-container
    • Uses pre-built https://github.com/rnbguy/mdx-docker
    • GitHub workflow mounts standard directories in non-standard places in docker, which messes up with some github-actions
    • macOS runner is disabled because it doesn't support docker
    opened by rnbguy 1
Owner
Informal Systems
Informal Systems
A lightweight encryption library in python.

XCrypt About This was initially a project to prove that I could make a strong encryption but I decided to publish it so that the internet peoples coul

Anonymous 8 Sep 10, 2022
Electrum - Lightweight Vertcoin client

Electrum - Lightweight Vertcoin client Electrum-VTC is a rebase of upstream Electrum and pulls in updates regularly. Donate VTC to support this work:

Vertcoin 4 Oct 14, 2022
Asyncio SDK for Azure Cosmos DB

Asyncio SDK for Azure Cosmos DB. This library is intended to be a very thin asyncio wrapper around the Azure Comsos DB Rest API. It is not intended to have feature parity with the Microsoft Azure SDKs but to provide async versions of the most commonly used interfaces.

Grant McDonald 4 Dec 4, 2021
Learn Blockchains by Building One, A simple Blockchain in Python using Flask as a micro web framework.

Blockchain ✨ Learn Blockchains by Building One Yourself Installation Make sure Python 3.6+ is installed. Install Flask Web Framework. Clone this repos

Vaibhaw 46 Jan 5, 2023
A telegram bot to track whales activities on multiple blockchains.

Telegram Bot : Whale Watcher A straightforward telegram bot written in python to track whales activity on multiple blockchains, using whale-alert API

Laurenz Bougan 1 Dec 10, 2021
TorchX is a library containing standard DSLs for authoring and running PyTorch related components for an E2E production ML pipeline.

TorchX is a library containing standard DSLs for authoring and running PyTorch related components for an E2E production ML pipeline

null 193 Dec 22, 2022
E2e music remastering system - End-to-end Music Remastering System Using Self-supervised and Adversarial Training

End-to-end Music Remastering System This repository includes source code and pre

Junghyun (Tony) Koo 37 Dec 15, 2022
Comprehensive-E2E-TTS - PyTorch Implementation

A Non-Autoregressive End-to-End Text-to-Speech (text-to-wav), supporting a family of SOTA unsupervised duration modelings. This project grows with the research community, aiming to achieve the ultimate E2E-TTS

Keon Lee 114 Nov 13, 2022
Unit testing AWS interactions with pytest and moto. These examples demonstrate how to structure, setup, teardown, mock, and conduct unit testing. The source code is only intended to demonstrate unit testing.

Unit Testing Interactions with Amazon Web Services (AWS) Unit testing AWS interactions with pytest and moto. These examples demonstrate how to structu

AWS Samples 21 Nov 17, 2022
Travis CI testing a Dockerfile based on Palantir's remix of Apache Cassandra, testing IaC, and testing integration health of Debian

Testing Palantir's remix of Apache Cassandra with Snyk & Travis CI This repository is to show Travis CI testing a Dockerfile based on Palantir's remix

Montana Mendy 1 Dec 20, 2021
PENBUD is penetration testing buddy which helps you in penetration testing by making various important tools interactive.

penbud - Penetration Tester Buddy PENBUD is penetration testing buddy which helps you in penetration testing by making various important tools interac

Himanshu Shukla 15 Feb 1, 2022
pytest plugin for distributed testing and loop-on-failures testing modes.

xdist: pytest distributed testing plugin The pytest-xdist plugin extends pytest with some unique test execution modes: test run parallelization: if yo

pytest-dev 1.1k Dec 30, 2022
PacketPy is an open-source solution for stress testing network devices using different testing methods

PacketPy About PacketPy is an open-source solution for stress testing network devices using different testing methods. Currently, there are only two c

null 4 Sep 22, 2022
Lightweight mmm - Lightweight (Bayesian) Media Mix Model

Lightweight (Bayesian) Media Mix Model This is not an official Google product. L

Google 342 Jan 3, 2023
A set of tools for creating and testing machine learning features, with a scikit-learn compatible API

Feature Forge This library provides a set of tools that can be useful in many machine learning applications (classification, clustering, regression, e

Machinalis 380 Nov 5, 2022
Python PyPi staging server and packaging, testing, release tool

devpi: PyPI server and packaging/testing/release tool This repository contains three packages comprising the core devpi system on the server and clien

null 629 Jan 1, 2023
Hypothesis is a powerful, flexible, and easy to use library for property-based testing.

Hypothesis Hypothesis is a family of testing libraries which let you write tests parametrized by a source of examples. A Hypothesis implementation the

Hypothesis 6.4k Jan 5, 2023
Generic automation framework for acceptance testing and RPA

Robot Framework Introduction Installation Example Usage Documentation Support and contact Contributing License Introduction Robot Framework is a gener

Robot Framework 7.7k Jan 7, 2023
Scalable user load testing tool written in Python

Locust Locust is an easy to use, scriptable and scalable performance testing tool. You define the behaviour of your users in regular Python code, inst

Locust.io 20.4k Jan 4, 2023
A modern API testing tool for web applications built with Open API and GraphQL specifications.

Schemathesis Schemathesis is a modern API testing tool for web applications built with Open API and GraphQL specifications. It reads the application s

Schemathesis.io 1.6k Jan 6, 2023