/shell-doctest

doctest for shell.

Primary LanguagePythonBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

========
Overview
========

shelldoctest is Doctest/UnitTest for shell.


Doctest for shell
=================

Usage
-----

test.py::

    #!/usr/bin/env python
    """
    $ echo TEST
    TEST
    $ LANG=C date -u -r 0
    Thu Jan  1 00:00:00 UTC 1970
    """

    if __name__ == "__main__":
        import shelldoctest
        shelldoctest.testmod()

Shell Doctest Syntax
--------------------

Basic::

    $ <COMMAND>
    <RESPONSE>

Multi Lines::

    $ <COMMAND>
    . <COMMAND>
    <RESPONSE>
    <RESPONSE>

with Label::

    [<LABEL>]
    $ <COMMAND>
    <RESPONSE>

Run on Remote Host::

    @<HOSTNAME>
    $ <COMMAND>
    <RESPONSE>

    [<LABEL>]
    @<HOSTNAME>
    $ <COMMAND>
    <RESPONSE>

Run by User::

    <USERNAME>@<HOSTNAME>
    $ <COMMAND>
    <RESPONSE>

    [<LABEL>]
    <USERNAME>@<HOSTNAME>
    $ <COMMAND>
    <RESPONSE>

Checking STDERR::

    $ <COMMAND>
    (<RETURNCODE>)<STDERR-RESPONSE>
    <STDOUT-RESPONSE>

Management Tool
---------------

`shell-doctest` command::

    $ shell-doctest test <PATH-TO-MODULE> ...

    $ shell-doctest test <LABEL> ...

    $ shell-doctest test <PATH-TO-MODULE> ... <LABEL> ...

Examples
~~~~~~~~

test.py::

    """
    $ echo TEST
    TEST

    [#1]
    $ echo TEST1
    TEST1

    [#2]
    $ echo TEST2
    TEST2
    """

Run TEST::

    $ shell-doctest test ./test.py

    $ shell-doctest --verbose=2 test ./test.py
    Module:test.py
    Label:None
    Label:#1
    Label:#2

    $ shell-doctest --verbose=2 test ./test.py #2 #1
    Module:test.py
    Label:#2
    Label:#1

    $ shell-doctest --verbose=3 test ./test.py #2
    New verbose level is 3
    Module:manage.py
    Label:#2
    Trying:
        echo TEST2
    Expecting:
        TEST2
    ok
    1 items passed all tests:
       1 tests in manage
    1 tests in 3 items.
    1 passed and 0 failed.
    Test passed.


UnitTest
========

::

    from doctest import ELLIPSIS

    from shelldoctest.shellunittest import Connection, TestCase

    host = "localhost:22"

    class MyTest(TestCase):
        c1 = Connection(host)
        c2 = Connection(host)

        def test(self):
            self.assertOutput(self.c1, "pwd", "/.../...\n", ELLIPSIS)
            self.c1("cd /", None)
            self.assertOutput(self.c2, "pwd", "/.../...\n", ELLIPSIS)
            self.assertOutput(self.c1, "pwd", "/\n")