porunga是一个简单算法的测试框架
porunga的Python项目详细描述
porunga是一个算法测试工具。
安装
为了安装porunga,只需运行:
pip install porunga
用法
基本上,我们需要特定的文件结构来测试我们的算法:
./foobar/ ./foobar/foobar.py ./foobar/testdata/ ./foobar/testdata/test01.in ./foobar/testdata/test01.out ./foobar/testdata/test02.in ./foobar/testdata/test02.out ./foobar/testdata/test03.in ./foobar/testdata/test03.out
这里,foobar是我们的问题name-对于父 目录和编码解决方案(这里有foobar.py,但它可以是其他的 语言-请参阅下面支持的语言;即,对于Java,我们将创建 foobar.java文件)
在./foobar/目录下,我们将运行:
$ porunga test --lang python
有关更多选项,请参阅帮助(您也可以在其中看到支持的语言):
$ porunga test -h
如果要设置测试的时间限制,可以使用--timeout开关。在 例如,如果需要在2.5秒以下运行测试,则可以运行:
$ porunga test --timeout 2.5
请注意,不支持非常低的超时值。此外,
Java
Java源文件的名称应与父目录相同,并且应包含 同名的公共类。所以如果我们的问题叫做foobar,我们会 使用名为foobar的公共类创建foobar.java文件。
教程
假设我们要解决以下问题:
问题
在输入端我们得到两个整数:n,m,其中1 <= n < m <= 100000。 您的程序应该写入以输出n和^{tt13}之间的所有Fibonacci numbers$ (包括两者)。输出处的数字应以空格分隔。
示例:
INPUT 1: 3 5 OUTPUT 1: 2 3 5 INPUT 2: 6 10 OUTPUT 2: 8 13 21 34 55
首先,让我们为我们的解决方案创建一个目录:
$ mkdir fibs $ cd fibs
我们还创建一个testdata目录(应该使用确切的名称)并将 有一些测试用例:
$ mkdir testdata $ echo '3 5' > testdata/test01.in $ echo '2 3 5' > testdata/test01.out $ echo '6 10' > testdata/test02.in $ echo '8 13 21 34 55' > testdata/test02.out
注意,测试输入和输出应该有.in和.out扩展名 分别是。
现在让我们创建我们的解决方案-我们可以选择任何受支持的语言,但是 为了本教程的目的,让它成为python模块。创建一个(暂时为空):
$ touch fibs.py
我们现在应该创建以下文件:
./fibs/ ./fibs/fibs.py ./fibs/testdata/ ./fibs/testdata/test01.in ./fibs/testdata/test01.out ./fibs/testdata/test02.in ./fibs/testdata/test02.out
就这样。我们现在可以在fibs目录中运行porunga,并查看 正在根据创建的测试用例测试解决方案:
$ porunga test Testing ./fibs ============== => Binary: python /Users/lukasz/temp/fibs/fibs.py => Testing ./fibs/testdata/test01.in ... Fail => Testing ./fibs/testdata/test02.in ... Fail => Total time: 0.058s => 2 out of 2 tests failed
好吧,我们有两个测试失败了,但我们还没有真正的编码。只是把 以下代码进入fibs.py:
import fileinput import re import sys def fib(n): if n in (1, 2): return 1 a = b = 1 for x in range(3, n + 1): a, b = b, a + b return b def main(): fin = fileinput.input() n, m = map(int, re.findall(r'\d+', fin.readline())) fibs = [str(fib(num)) for num in range(n, m + 1)] result = ' '.join(fibs) sys.stdout.write(result) if __name__ == '__main__': main()
(这不是最优代码,因为我们每次都计算斐波那契数,但它可以 易于升级)
让我们再次运行测试:
$ porunga test Testing ./fibs ============== => Binary: python ./fibs/fibs.py => Testing ./fibs/testdata/test01.in ... OK [0.030]s => Testing ./fibs/testdata/test02.in ... OK [0.033]s => Total time: 0.063s => All 2 tests passed