Skip to main content

a small but very useful testing library for Python

Project description

Release: 0.2.0

Overview

PicoTest.py is a small but very useful testing library for Python.

Basic Example

PicoTest.py uses with statement instead of TestCase class.

  • Test topc or context is represented by with statement.

  • Test spec is represented by @test decorator.

examples/1_basic_test.py:

import picotest
test = picotest.new()

with test("assertion example"):

    @test("1+1 should be 2")
    def _():                # 'self' is not required
        assert 1+1 == 2

    @test("assertion methods of unittest are avaiable")
    def _(self):
        self.assertEqual("Haruhi".upper(), "HARUHI")

    @test("'assertTextEqual()' is available which shows diff of two texts")
    def _(self):
        expected = "Haruhi\nMikuru\nYuki"
        actual   = "\n".join(["Haruhi", "Mikuru", "Yuki"])
        #actual   = "\n".join(["Haruhi", "Michiru", "Yuki"])
        self.assertTextEqual(expected, actual)

if __name__ == '__main__':
    picotest.main()

Output example (verbose style):

$ python examples/1_basic_test.py
* assertion example
  - [passed] 1+1 should be 2
  - [passed] assertion methods of unittest are avaiable
  - [passed] 'assertTextEqual()' is available which shows diff of two texts
----------------------------------------------------------------------
## total:3, passed:3, failed:0, error:0, skipped:0, todo:0

Output example (plain style):

$ python examples/1_basic_test.py -sp   # or -s plain
...
## total:3, passed:3, failed:0, error:0, skipped:0, todo:0

Test Structure

Nested test structure is available. This makes you to write tests in structured style.

examples/2_structure_test.py:

import picotest
test = picotest.new()

with test("ClassName"):

    with test("#method_name()"):

        with test("when base is not specified..."):

            @test("int('11') should be 11")
            def _():
                assert int('11') == 11

        with test("when base is specified..."):

            @test("int('11', 16) should be 17")
            def _():
                assert int('11', 16) == 17

            @test("int('11', 8) should be 9")
            def _():
                assert int('11', 8) == 9

            @test("int('11', 2) should be 3")
            def _():
                assert int('11', 2) == 3

if __name__ == '__main__':
    test.main()

Setup and Teadown Fixture

Setup and teardown fixtures are available. They are provided by decorators.

@test.before

Same as setUp(). Invoked before each test.

@test.after

Same as tearDown(). Invoked after each test.

@test.before_all

Similar to setUpClass(). Invoked only once before all tests.

@test.after_all

Similar to tearDownClass(). Invoked only once after all tests.

examples/3_setup_teadown_test.py:

import os
import picotest
test = picotest.new()

with test("fixtures (setup, teardown) example"):
    PWD = os.getcwd()

    @test.before_all   # setupAll
    def _():
        os.mkdir("_sandbox")
        os.chdir("_sandbox")

    @test.after_all    # afterAll
    def _():
        os.chdir(PWD)
        os.rmdir("_sandbox")

    @test.before       # setup
    def _(self):
        self.name = "Haruhi"
        self.team = "SOS"

    @test.after        # teardown
    def _(self):
        pass

    @test("fixture should be called #1")
    def _(self):
        self.assertEqual("Haruhi", self.name)

    @test("fixture should be called #2")
    def _(self):
        self.assertEqual("SOS", self.team)

if __name__ == '__main__':
    picotest.main()

Fixture Injection

Fixture Injection is available which is more flexible than setup/teardown.

examples/4_fixture_injection_test.py:

import os
import picotest
test = picotest.new()

with test("fixture injection example"):

    @test.fixture
    def member(self):
        yield "Haruhi"     # use 'yield', not 'return'

    @test.fixture
    def team():            # 'self' is optional
        yield "SOS"

    @test("fixture is injected automatically")
    def _(self, member, team):
        assert member == "Haruhi"
        assert team   == "SOS"

    @test.fixture
    def tmpfile(self):
        ## setup temporary file
        filename = "_tmpfile.txt"
        with open(filename, "w") as f: f.write("SOS\n")
        yield filename
        ## teardown temporary file
        os.unlink(filename)

    @test("temporary file is created and removed automatically")
    def _(tmpfile):
        assert tmpfile == "_tmpfile.txt"
        with open(tmpfile) as f:
            assert f.read() == "SOS\n"

if __name__ == '__main__':
    picotest.main()

Skip and Todo

PicoTest.py supports test skip and todo.

picotest.skip_when(condition, reason)

When condition is true then skip rest assertions.

picotest.todo

Decorator to represents that “feature is not implemented yet”.

test.TODO(description):

Same as:

@test("...description...")
@todo
def _():
    assert False     # expected failure

example/5_skip_and_todo_test.py:

import picotest
from picotest import skip_when, todo
test = picotest.new()

with test("skip and todo example"):

    @test("skip test when condition is true")
    def _(self):
        condition = True
        skip_when(condition, "REASON")
        assert 1 == 0     # unreachable

    @test("'@todo' means 'not implemented yet'")
    @todo
    def _(self):
        assert 1 == 0    # expected failure

    test.TODO("something what you have to do #1")
    test.TODO("something what you have to do #2")

if __name__ == '__main__':
    picotest.main()

Extened Assertion Methods

PicoTest.py adds some new assertion methods to unittest.TestCase class.

self.assertTextEqual(expected, actual)

Similar to assertEqual(), but diplays unified diff when actual and expected are different text. Equivarent to assertMultilineEqual() but available in Python 2.6 or older. Example:

expected = "Haruhi\nMikuru\nYuki\n"
actual   = "Haruhi\nMichiru\nYuki\n"
self.assertTextEqual(expected, actual)
## output:
# AssertionError: texts are not equal.
# --- expected
# +++ actual
# @@ -1,3 +1,3 @@
#  Haruhi
# -Mikuru
# +Michiru
#  Yuki
self.assertException(function, exceptionclass[, errormsg=None])

Similar to assertRaise(), but this can check error message. errormsg can be string or pattern object compiled by re.compile(). In addition, you can get exeption object as function.exception. Example:

def fn(): int("foo")
self.assertException(fn, ValueError, "invalid literal for int() with base 10: 'foo'")
## or
self.assertException(fn, ValueError, re.compile(r'^invalid literal'));
## or
self.assertException(fn, ValueError)
self.assertEqual("invalid literal for int() with base 10: 'foo'", str(fn.exception))
self.assertNotException(function[, exceptionclass=Exception])

Confirms that function doesn’t raise exception. Example:

def fn(): int("FF", 16)
self.assertNotException(fn)

Command-line Interface

PicoTest.py provides command-line interface:

$ python test/foo_test.py        # run test script (verbose style)
$ python test/foo_test.py -sp    # run test script (plain style)
$ python test/*.py               # run all test scripts
$ python -m picotest test/*.py   # run all test scripts
$ python -m picotest test        # run all under 'test' directory
$ python -m picotest -h                 # show help
$ python -m picotest -v                 # print version
$ python -m picotest -sv test/*.py      # or -s verbose
$ python -m picotest -ss test/*.py      # or -s simple
$ python -m picotest -sp test/*.py      # or -s plain
$ python -m picotest --test='...' test  # filter by description
$ python -m picotest -D test/*.py       # show all backtrace

picotest.main() exists process with status code which represens number of failed or error tests:

$ python examples/1_basic_test.py -sp
..f
----------------------------------------------------------------------
[Failed] assertion example > 'assertTextEqual()' is available which shows diff of two texts
   :
----------------------------------------------------------------------
## total:3, passed:2, failed:1, error:0, skipped:0, todo:0
$ echo $?
1                 # number of failed or error tests

License

$License: MIT License $

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

PicoTest-0.2.0.tar.gz (17.4 kB view details)

Uploaded Source

Built Distributions

PicoTest-0.2.0-py3.0.egg (19.5 kB view details)

Uploaded Source

PicoTest-0.2.0-py2.4.egg (19.7 kB view details)

Uploaded Source

File details

Details for the file PicoTest-0.2.0.tar.gz.

File metadata

  • Download URL: PicoTest-0.2.0.tar.gz
  • Upload date:
  • Size: 17.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for PicoTest-0.2.0.tar.gz
Algorithm Hash digest
SHA256 4f44311188988bfd6c64d5de53116f5c5a08faa2bd41c327baed8a2cd28adf8d
MD5 0c04c396ce1ad92d3b98b7735101cc23
BLAKE2b-256 6706fea8c3b0a84166de8a8b2c0fd3a2e9ef1df71bfb75b83b943995cf655246

See more details on using hashes here.

File details

Details for the file PicoTest-0.2.0-py3.0.egg.

File metadata

  • Download URL: PicoTest-0.2.0-py3.0.egg
  • Upload date:
  • Size: 19.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for PicoTest-0.2.0-py3.0.egg
Algorithm Hash digest
SHA256 73532c1d32f879164af2c21317f4846ecc7c95fef11b16dab8d91e89a40ccc3e
MD5 5ad5f8055c1d25285239f59a0064f860
BLAKE2b-256 44f8318432d1e80f9c2bb2221b7dc9fe5ce0c839ab70f8d7b1edbc9c89a8a749

See more details on using hashes here.

File details

Details for the file PicoTest-0.2.0-py2.4.egg.

File metadata

  • Download URL: PicoTest-0.2.0-py2.4.egg
  • Upload date:
  • Size: 19.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for PicoTest-0.2.0-py2.4.egg
Algorithm Hash digest
SHA256 a54a6639461de6af57a9157d8fcd80ada90a0516aa1a06fbf4061813fb76c448
MD5 6f587f59036bc70b79b838634566bc6b
BLAKE2b-256 c9d6b5112af20e99f8d0de85a8b27b7c928257a4f0a4b69ccecdb0c2fa874453

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page