假设我有一个类:
class SqlUtil(object):
def __init__(self):
self.conn = pymysql.connect(......)
def method_1(self)
def method_2(self)
def method_3(self)
def method_4(self)
def method_5(self)
def method_6(self)
def method_7(self)
def method_8(self)
def method_9(self)
我需要测试这个类的每一个方法。那么问题来了,如果我的测试代码这样写,我每一个测试案例都需要实例化这个类,那么就要连接很多次数据库。
TestSql(object):
def test_method1(self):
ins = SqlUtil()
result = ins.method_1()
assert result == 1
如果其中的只有 method_1~7 需要使用数据库连接,method_8, method_9 实际上不需要数据库,我初始化被测试类,就白白浪费了数据库连接。
所以请问,这种场景下,是否只初始化 1 次被测试类会更好?
如果被测试的方法需要向数据库写入数据,那么 MySQL 的写入操作是 mock 一下更好,还是真的需要读取 MySQL 来确定数据是否真的写入成功了?
1
virusdefender 2018-12-19 18:52:27 +08:00
白白浪费了数据库连接,测试场景下感觉可以接受吧
|
2
itskingname OP @virusdefender #1 就是有点奇怪
|
3
xavierskip 2018-12-19 19:58:00 +08:00
如果你觉得这是浪费数据库连接的话,这也是你写的类的问题而不是单元测试的问题。
|
4
itskingname OP @xavierskip 嗯,是的,如果确实有必要在每个测试案例里面都实例化类,那我可以修改类。
|
5
snBDX1b0jJM4ogKd 2018-12-19 21:43:24 +08:00 via Android
不是有 setupClass 吗
|
6
megachweng 2018-12-20 09:29:07 +08:00 via iPhone
Pytest 安利一下 数据库连接放到 Fixture 里面 scope=module 或 session,测试太美好了
|
7
itskingname OP @megachweng #6 我现在就在使用 pytest
|
8
itskingname OP @megachweng #6 我的数据库连接是在被测试的类的__init__方法里面的。你是指我在 fixture 里面初始化这个类吗?
|
9
megachweng 2018-12-20 10:24:43 +08:00 via iPhone
@itskingname @pytest.fixture(scope=“ session ”)
def db(): return SqlUtil() @pytest.parametrize(‘ n ’,[1,2,3,4,]) def test_xxx(db): assert greattr(f ’ method_{n}’)() |
10
megachweng 2018-12-20 10:25:39 +08:00 via iPhone
@megachweng 补充一下测试函数少了个 n 参数
|
11
megachweng 2018-12-20 10:27:31 +08:00 via iPhone
@megachweng 手机上打字,有些错误,思想就是把耗时的工作放到 fixture 里面,一次初始化多处使用
|
12
itskingname OP @megachweng #11 明白。感谢~如此甚好,如此甚好
|