Mojo包含一个用于开发和执行单元测试的框架。该框架还支持在API引用的文档字符串(也称为文档字符串)中测试代码示例。Mojo测试框架由一组定义为Mojo标准库一部分的断言和Mojo测试命令行工具组成。
开始
让我们从编写和运行mojo测试的简单例子开始。
1.写测试
对于使用Mojo测试框架的第一个示例,创建一个名为test_quickstart的文件。Mojo包含以下代码:
# Content of test_quickstart.mojo
from testing import assert_equal
def inc(n: Int) -> Int:
return n + 1
def test_inc_zero():
# This test contains an intentional logical error to show an example of
# what a test failure looks like at runtime.
assert_equal(inc(0), 0)
def test_inc_one():
assert_equal(inc(1), 2)
在这个文件中,inc()函数是测试目标。名称以test_开头的函数是测试。通常目标应该位于与其测试分开的源文件中,但是对于这个简单的示例,您可以在同一个文件中定义它们。
如果测试函数在执行时引发错误,则失败,否则通过。本例中的两个测试使用assert_equal()函数,如果提供的两个值不相等,则会引发错误。
test_inc_zero()的实现包含一个有意的逻辑错误,以便在本教程的下一个步骤中执行测试时可以看到一个失败的测试示例。
2.进行测试
然后在包含该文件的目录下,在shell中执行以下命令:
mojo test test_quickstart.mojo
您应该看到与此相似的输出(请注意,这个示例从所显示的输出中选择了完全文件系统路径):
Testing Time: 1.193s
Total Discovered Tests: 2
Passed : 1 (50.00%)
Failed : 1 (50.00%)
Skipped: 0 (0.00%)
******************** Failure: 'ROOT_DIR/test_quickstart.mojo::test_inc_zero()' ********************
Unhandled exception caught during execution
Error: At ROOT_DIR/test_quickstart.mojo:8:17: AssertionError: `left == right` comparison failed:
left: 1
right: 0
********************
输出首先是总结发现、通过、失败和跳过的测试数量。此后,每个失败的测试都会连同其错误消息一起报告。
testing模块
Mojo标准库包括一个测试模块,该模块定义了几个用于实现测试的断言函数。如果满足条件,每个断言返回None,如果不满足则引发错误。
- assert_true():断言输入值为True。
- assert_false():断言输入值为False。
- assert_equal():判断输入值是否相等。
- assert_not_equal():断言输入值不相等。
- assert_almost_equal():断言输入值在一个公差范围内相等。
布尔断言在失败时报告一条基本错误消息。
from testing import *
assert_true(False)
输出:
Unhandled exception caught during execution
Error: At Expression [1] wrapper:14:16: AssertionError: condition was unexpectedly False
每个函数还接受一个可选的msg关键字参数,用于在断言失败时提供一条自定义消息。
assert_true(False, msg="paradoxes are not allowed")
输出:
Unhandled exception caught during execution
Error: At Expression [2] wrapper:14:16: AssertionError: paradoxes are not allowed
为了比较浮点值,您应该使用assert_almost_equal(),它允许您指定绝对或相对公差。
result = 10 / 3
assert_almost_equal(result, 3.33, atol=0.001, msg="close but no cigar")
Unhandled exception caught during execution
Error: At Expression [3] wrapper:15:24: AssertionError: