[ANN] Oktest 0.6.0 released - a new-style testing library

M

Makoto Kuwata

Hi all,

I released Oktest 0.6.0.
http://pypi.python.org/pypi/Oktest/
http://packages.python.org/Oktest/

Oktest is a new-style testing library for Python.
::

from oktest import ok
ok (x) > 0 # same as assert_(x > 0)
ok (s) == 'foo' # same as assertEqual(s, 'foo')
ok (s) != 'foo' # same as assertNotEqual(s, 'foo')
ok (f).raises(ValueError) # same as assertRaises(ValueError, f)
ok (u'foo').is_a(unicode) # same as assert_(isinstance(u'foo', unicode))
not_ok (u'foo').is_a(int) # same as assert_(not isinstance(u'foo', int))
ok ('A.txt').is_file() # same as assert_(os.path.isfile('A.txt'))
not_ok ('A.txt').is_dir() # same as assert_(not os.path.isdir('A.txt'))

See http://packages.python.org/Oktest/ for details.

NOTICE!! Oktest is a young project and specification may change in the future.


New features in this release
----------------------------

Oktest supports Tracer class which can be mock or stub of function or method.

Example to create fake object::

## create fake objects
from oktest.tracer import Tracer
tr = Tracer()
foo = tr.fake_obj(m1=100, m2=200) # method name and return-value
bar = tr.fake_obj(m3=lambda self, x: x+1) # method name and body
## call fake methods
ok (bar.m3(0)) == 1
ok (foo.m2(1,2,3)) == 200 # any argument can be passed
ok (foo.m1(x=123)) == 100 # any argument can be passed
## check results
ok (repr(tr[0])) == 'm3(0) #=> 1'
ok (repr(tr[1])) == 'm2(1, 2, 3) #=> 200'
ok (repr(tr[2])) == 'm1(x=123) #=> 100'

There are several ways to check results::

from oktest.tracer import Tracer
tr = Tracer()
obj = tr.fake_obj(meth=9)
ok (obj.meth(1, 2, x=3)) == 9
## check results
ok (repr(tr[0])) == 'meth(1, 2, x=3) #=> 9'
## or
ok (tr[0].list()) == [obj, 'meth', (1, 2), {'x': 3}, 9]
## or
ok (tr[0]) == [obj, 'meth', (1, 2), {'x': 3}, 9]
## or
ok (tr[0].receiver).is_(obj)
ok (tr[0].name) == 'meth'
ok (tr[0].args) == (1, 2)
ok (tr[0].kwargs) == {'x': 3}
ok (tr[0].ret) == 9

Example to trace method call::

class Foo(object):
def m1(self, x):
return x + 1
def m2(self, y):
return y + 1
obj = Foo()
## trace methods
from oktest.tracer import Tracer
tr = Tracer()
def dummy(original_func, *args, **kwargs):
#return original_func(*args, **kwargs)
return 100
tr.fake_method(obj, m1=dummy, m2=200)
## call methods
ok (obj.m1(1)) == 100
ok (obj.m2(2)) == 200
## check results
ok (tr[0]) == [obj, 'm1', (1,), {}, 100]
ok (tr[1]) == [obj, 'm2', (2,), {}, 200]

Example to trace function call::

def f(x):
return x+1
def g(y):
return f(y+1) + 1
## trace functions
from oktest.tracer import Tracer
tr = Tracer()
f = tr.trace_func(f)
g = tr.trace_func(g)
## call functions
ok (g(0)) == 3
## check results
ok (tr[0]) == [None, 'g', (0,), {}, 3]
ok (tr[1]) == [None, 'f', (1,), {}, 2]

Example to fake method call::

class Foo(object):
def m1(self, x):
return x + 1
def m2(self, y):
return y + 1
obj = Foo()
## fake methods
from oktest.tracer import Tracer
tr = Tracer()
def dummy(original_func, *args, **kwargs):
#return original_func(*args, **kwargs)
return 100
tr.fake_method(obj, m1=dummy, m2=200)
## call method
ok (obj.m1(1)) == 100
ok (obj.m2(2)) == 200
## check results
ok (tr[0]) == [obj, 'm1', (1,), {}, 100]
ok (tr[1]) == [obj, 'm2', (2,), {}, 200]

Example to fake function call::

def f(x):
return x*2
## fake a function
def dummy(original_func, x):
#return original_func(x)
return 'x=%s' % repr(x)
from oktest.tracer import Tracer
tr = Tracer()
f = tr.fake_func(f, dummy)
## call function
ok (f(3)) == 'x=3'
## check results
ok (tr[0]) == [None, 'f', (3,), {}, 'x=3']


Have a nice weekend!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,901
Latest member
Noble71S45

Latest Threads

Top