代码示例: pytest的简单用法

demo文件目录结构:

 

demo_project/

|----------- __init__.py

|----------- demo_test.py

|----------- test_dbversion.py

|----------- serialize.py

|----------- readme.txt

 

说明:

执行结果中包含print输出。需要注意的是,在pytest中,print输出不能直接使用print("xxx")的方式,因为会被pytest模块归入capsys中。

因为对于pytest而言,print属于sys.stdout,即输出结果的类型。类似的,assert属于sys.stderr的类型

具体的捕获方式参考: https://docs.pytest.org/en/latest/capture.html#capturing-of-the-stdout-stderr-output

简单贴一下官方示例代码:

1 def test_myoutput(capsys):  # or use "capfd" for fd-level
2     print("hello")
3     sys.stderr.write("world\n")
4     captured = capsys.readouterr()
5     assert captured.out == "hello\n"
6     assert captured.err == "world\n"
7     print("next")
8     captured = capsys.readouterr()
9     assert captured.out == "next\n"

因此,在我的示例代码中,使用with通过上下文管理,临时关闭capsys,使得print的结果能被打印出来,具体效果参见最后的执行结果示例

 

各文件代码如下:

__init__.py

 1 #

 

demo_test.py

 1 import pytest
 2 
 3 
 4 @pytest.mark.test
 5 def test_demo(capsys):
 6     with capsys.disabled():
 7         print(host_info_call_data())
 8     assert host_info_call_data() == '''hostname\tplatform\tcpus    cores\tsockets\tmemory(GB)
 9 rac1    Linux x86 64-bit    2    2    2    7.69    '''
10     return 1
11 
12 
13 def host_info_call_data():
14     data = '''hostname    platform    cpus    cores    sockets    memory(GB)
15 rac1    Linux x86 64-bit    2    2    2    7.69    '''
16     return data

 

 

test_dbversion.py

 1 import pytest
 2 
 3 from .serialize import serialize
 4 
 5 
 6 def script_data(num):
 7     data = {
 8         1: '''rdbms_version\tcluster_version
 9 11.2.0.4.0\t11.2.0.4.0
10 ''',
11         2: '''rdbms_version\tcluster_version
12 11.2.0.4.0    -
13 '''
14     }
15     return data[num]
16 
17 
18 @pytest.mark.test
19 @pytest.mark.shells
20 def test_all_version_exist(capsys):
21     data = script_data(1)
22     row, column, data = serialize(data)
23     with capsys.disabled():
24         print(data)
25     assert data == [['rdbms_version', 'cluster_version'],
26                     ['11.2.0.4.0', '11.2.0.4.0']]

 

 

serialize.py

 1 def serialize(data):
 2     if isinstance(data, list):
 3         data = str(data)
 4     data = data.split('\n')
 5     if data[-1] == '':
 6         data = data[:-1]
 7     data = [i.split('\t') for i in data if isinstance(i, str)]
 8     row = len(data)
 9     column = len(data[0])
10     return row, column, data

 

 

 

执行结果示例:

 

posted @ 2018-07-10 18:35  然语  阅读(398)  评论(0编辑  收藏  举报