一种方法是在子测试名称前加下划线(
_
),以使它们不被
unittest
模块视为测试,然后构建一个测试用例,该用例基于执行这些子操作的正确顺序构建。
这比依赖
unittest
模块的排序顺序更好,因为明天可能会改变,并且实现顺序拓扑排序也不是很简单。
这种方法的示例,
取自此处(免责声明:我的模块),如下所示。
在这里,测试用例运行独立的测试,例如检查表参数未设置(
test_table_not_set
)或测试主键(
test_primary_key
)仍然并行,但只有在正确的顺序和前一个操作设置的状态下才需要进行
CRUD测试。因此,这些测试已经被分离成单独的
unit
,而不是测试。然后,另一个测试 (
test_CRUD
) 构建这些操作的正确顺序并对其进行测试。
import os
import sqlite3
import unittest
from sql30 import db
DB_NAME = 'review.db'
class Reviews(db.Model):
TABLE = 'reviews'
PKEY = 'rid'
DB_SCHEMA = {
'db_name': DB_NAME,
'tables': [
{
'name': TABLE,
'fields': {
'rid': 'uuid',
'header': 'text',
'rating': 'int',
'desc': 'text'
},
'primary_key': PKEY
}]
}
VALIDATE_BEFORE_WRITE = True
class ReviewTest(unittest.TestCase):
def setUp(self):
if os.path.exists(DB_NAME):
os.remove(DB_NAME)
def test_table_not_set(self):
"""
Tests for raise of assertion when table is not set.
"""
db = Reviews()
try:
db.read()
except Exception as err:
self.assertIn('No table set for operation', str(err))
def test_primary_key(self):
"""
Ensures, primary key is honored.
"""
db = Reviews()
db.table = 'reviews'
db.write(rid=10, rating=5)
try:
db.write(rid=10, rating=4)
except sqlite3.IntegrityError as err:
self.assertIn('UNIQUE constraint failed', str(err))
def _test_CREATE(self):
db = Reviews()
db.table = 'reviews'
db.write(tbl='reviews', rid=1, header='good thing', rating=5)
db.create(tbl='reviews', rid=2, header='good thing', rating=5)
db.write(tbl='reviews', rid=3, header='good thing', rating=5)
db.create(tbl='reviews', rid=4, header='good thing', rating=5)
db.commit()
def _test_READ(self):
db = Reviews()
db.table = 'reviews'
rec1 = db.read(tbl='reviews', rid=1, header='good thing', rating=5)
rec2 = db.read(rid=1, header='good thing')
rec3 = db.read(rid=1)
self.assertEqual(rec1, rec2)
self.assertEqual(rec2, rec3)
recs = db.read()
self.assertEqual(len(recs), 4)
def _test_UPDATE(self):
db = Reviews()
db.table = 'reviews'
where = {'rid': 2}
db.update(condition=where, header='average item', rating=2)
db.commit()
rec = db.read(rid=2)[0]
self.assertIn('average item', rec)
def _test_DELETE(self):
db = Reviews()
db.table = 'reviews'
db.delete(rid=2)
db.commit()
self.assertFalse(db.read(rid=2))
def test_CRUD(self):
self._test_CREATE()
self._test_READ()
self._test_UPDATE()
self._test_DELETE()
def tearDown(self):
os.remove(DB_NAME)
sorted()
并不是必需的,因为dir()
按字母顺序保证返回步骤方法。这也是为什么unittest
默认按字母顺序处理测试类和测试方法(即使sortTestMethodsUsing
为None)- 这可以用于实用性,例如让最新的工作测试首先运行,以加快编辑 - 测试运行周期。 - kxr