Post

单元测试相关笔记与思考

Pytest文档地址:https://docs.pytest.org/en/latest/contents.html

兼容性

refer:

Fixture

1
2
3
4
@pytest.fixture(...)
def sql_cli():
    ... # 省略
    return SQLClient(...)

Teardown

A better way:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@pytest.fixture(scope=...)
def sql_cli():
    ... # 省略
    c = SQLClient(...)
    yield c
    # 出scope时执行
    c.close() 

# or more pythonic

@pytest.fixture(scope=...)
def sql_cli():
    with SQLClient(...) as c:
    	yield c

e.g. 通过任何方式直接调用接口的方式都不推荐,可能造成脏数据无法清理,使用内置Client更好

Scope

fixture的作用范围(function, class, module or session),基于fixture的产生成本来设置。

scope等级更高(session>module)的fixture会被更早初始化。(doc

pytest会自动优化初始化过程,初始化和释放顺序见:Automatic grouping of tests by fixture instances

参数化

1
2
3
@pytest.fixture(scope=..., params=[1, 2])
def foo(request):
    return request.param

所有基于这个fixture的测试函数都会运行两次。

还可以用mark结合参数化fixture:marks with parametrized fixtures

一些内置Fixture

request request-context请求上下文(doc),可以用来introspect详细的上下文信息,比如params,scope,fixturename

存疑

Using fixtures from classes, modules or projects

其他

  • 《Python Web》提及单元测试的placeholder写法,此基础上后续完善会简单许多
  • 这里显然需要幂等原则
This post is licensed under CC BY 4.0 by the author.