Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python单元测试错误?_Python_Unit Testing - Fatal编程技术网

Python单元测试错误?

Python单元测试错误?,python,unit-testing,Python,Unit Testing,在这个简单的单元测试中,只能运行一个测试用例。当我注释掉其中一个测试用例时,其余的测试运行并通过,模块正常终止。当我允许运行两个测试用例时,第一个用例通过,第二个用例永远不会终止。模块从不终止。我用相同的用例创建了其他模块,每个测试用例都可以单独运行 我不知道发生了什么,除了unittest中出现奇怪错误的可能性很小(通常不是正确的结论——我的代码总是罪魁祸首) 你说得对。db和curs需要在设置中。此外,正在测试的代码也使用globals连接到同一数据库并将光标放在同一数据库上。不确定问题到底

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

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

你说得对。db和curs需要在设置中。此外,正在测试的代码也使用globals连接到同一数据库并将光标放在同一数据库上。不确定问题到底出在哪里,但这使得mysql中的进程处于休眠状态。将连接和光标创建移动到实际函数中解决了这个问题


我认为问题的一部分是在测试之间运行这个特定的设置。当我注释掉安装程序时(因为没有拆卸,数据库仍然存在),我可以运行多个测试。这表明我被MySQL错误中的drop table捕获了几个小时。正如您所知,安装程序是在每次测试之前运行的。我会尝试在安装程序中的每一行之前添加打印语句,看看哪一行被卡住了。随机表名如何?这将允许MySQL在后台删除该表,您可以在
tearDown()
中触发该表。而且,将
db
curs
作为全局变量似乎是错误的。我希望它们在
setUp()
中创建,并附加到
self
中。打开连接和表引用可能会导致数据库的开销和速度降低,因为它不能简单地丢弃数据。我必须承认,我很高兴对MySQL一无所知,所以我可能完全错了。这是一个元数据锁定问题,如下所述:。有点令人震惊的是,即使是select也会导致元数据锁定。哇!
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()