3

この単純な単体テストでは、1 つのテスト ケースのみを実行できます。いずれかのテスト ケースをコメント アウトすると、残りのテストが実行され、合格し、モジュールが正常に終了します。両方のテスト ケースの実行を許可すると、最初のケースは成功し、2 番目のケースは決して終了しません。モジュールは決して終了しません。同じケースで他のモジュールを作成しましたが、各テストケースは常に個別に実行できます。

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 に答える