首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用doctest进行测试

使用doctest进行测试

作者头像
用户2936342
发布2018-08-27 15:24:43
1.1K0
发布2018-08-27 15:24:43
举报
文章被收录于专栏:nummynummy

python中的doctest可以运行文档中嵌入的例子,并验证它们能否生成所期望的结果,从而对源代码进行测试。

1.示例

建立测试文件test.py

def add(a,b):
      """
      >>> add(1,2)
      3
      >>> add(4,5)
      9
      """
      return a + b

运行测试时,必须使用-m参数将doctest作为脚本来执行,但是运行测试一般不会有输出,可以使用-v参数得到详细测试信息。

python -m doctest -v test.py

得到结果如下所示:

$ python -m doctest -v test.py 
Trying:
    add(1,2)
Expecting:
    3
ok
Trying:
    add(4,5)
Expecting:
    9
ok
1 items had no tests:
    test
1 items passed all tests:
   2 tests in test.add
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

但是在docstring中并非所有的内容都是测试用例,docstring中还包含其他文本,那怎么去区分这些内容呢?在docstring中测试用例以提示符>>>开始,以空行或者下一个>>>结束,介于中间的文本会被忽略。 例如:

def add(a,b):
      """
      Returns a + b
      >>> add(1,2)
      3
      >>> add(4,5)
      9
      """
      return a + b

修改后的内容测试结果是一样的。

2.处理不可预测的输出

有些情况下,可能无法预测准确的输出,但是依然可以进行测试。例如,获取某个对象的ID,每次运行测试的时候,得到的ID都是不一样的。

def identity(obj):
      """
      >>> identity(1)
      23400792
      """
      return id(obj)

每次运行的时候,获取的ID值都是不一样的,所以执行上面的测试代码是不能通过的。 测试的值可能会以不可预测的方式改变时,如果具体值对于测试结果并不重要,可以使用ELLIPSIS选项来告诉doctest忽略验证值的某些部分。 例如: demo.py

class MyClass(object):
    pass

def unpredictable(obj):
    """Returns a new list containing obj.

    >>> unpredictable(MyClass()) #doctest: +ELLIPSIS
    [<demo.MyClass object at 0x...>]
    """
    return [obj]

unpredictable之后的注释#doctest: ELLIPSIS告诉doctest打开这个测试的ELLIPSIS选项,...将替换对象id的内存地址,这样就会忽略期望值中的一部分,实际输出将匹配,并通过测试。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.03.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.示例
  • 2.处理不可预测的输出
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档