3

在这个简单的单元测试中,只能运行一个测试用例。当我注释掉任一测试用例时,剩余的测试将运行、通过,并且模块正常终止。当我允许运行两个测试用例时,第一个案例通过,第二个案例永远不会终止。模块永远不会终止。我创建了具有相同案例的其他模块,并且每个测试用例始终可以单独运行。

我无法弄清楚发生了什么,除了 unittest 中出现奇怪错误的可能性很小(通常不是正确的结论——我的代码总是罪魁祸首)。

from glob import glob
from email import message_from_string
from database import login_info
import maildb
import unittest

import mysql.connector as DBC

db = DBC.connect(**login_info)
curs = db.cursor()

TBLDEF = """
CREATE TABLE message (
    msgID INTEGER AUTO_INCREMENT PRIMARY KEY,
    msgMessageID VARCHAR(128),
    msgText LONGTEXT
    )"""
FILESPEC = "C:/PythonData/*.eml"

class testRealEmail_traffic(unittest.TestCase):
    def setUp(self):
        """
        Reads arbitrary number of email messages and stores them
        in a brand new messages table.
        Destroys any previous table named message.
        """

        curs.execute("DROP TABLE IF EXISTS message")
        db.commit()
        curs.execute(TBLDEF)
        db.commit()

        files = glob(FILESPEC)
        self.msgids = {}
        self.message_ids = {}
        for f in files:
            ff = open(f)
            text = ff.read()
            msg = message_from_string(text)
            id = self.msgids[msg['message-id']] = maildb.store(msg)
            self.message_ids[id] = msg['message-id']

    def test_not_empty(self):
        """
        Make sure the setUp method created messages and loaded the table.
        """
        curs.execute("SELECT COUNT(*) FROM message")
        messagecount = curs.fetchone()[0]
        self.assertGreater(messagecount, 0, "Database message table is empty")

    def test_a_test(self):
        self.assertEqual(1,1)

if __name__ == "__main__":
    unittest.main()
4

1 回答 1

0

你对全局变量是正确的。db 和 curs 需要在设置中。此外,正在测试的代码也使用全局变量连接到同一个数据库并在同一数据库上游标。不确定问题到底出在哪里,但这会在 mysql 中留下休眠进程。将连接和光标创建移动到实际功能中解决了这个问题。

于 2013-12-10T02:22:27.473 回答