Os.system 和 mysql 恢复在 python 单元测试中不起作用
Os.system and mysql restore not working in python unittest
我正在对一个在数据库中保存条目的程序进行单元测试"mydatabase"。因此,我需要在测试每个功能后恢复数据库,以免其他测试受到影响。我试着用os.system()写了一个mysql命令来恢复。以下是程序的相关部分:
class testSql(unittest.TestCase):
def setUp(self,
dbName = "mydatabase",
existingUser = "John",
nonExistingUser = "thisnamedoesnotexist",
):
os.system('mysql -u root -ppassword mydatabase < "mypath/schema.sql"')
self.dbName = dbName
self.existingUser = existingUser
self.nonExistingUser = nonExistingUser
def test_signUp(self):
self.assertFalse(sql.userExists(self.nonExistingUser))
sql.signUp(self.nonExistingUser,"password")
self.assertTrue(sql.userExists(self.nonExistingUser))
当我 运行 程序时,然而,而不是显示测试结果,我只看到 mysql 命令的结果,终端冻结,所以我不能输入任何内容并强制关闭它:Result from terminal
我尝试了什么:用 os.system 创建一个函数并调用它;导入具有该功能的文件;使用 exec() 函数通过语句执行文件;正在导入文件以执行语句。
显然,os.system("mysql -u root -ppassword") 工作得很好,但不是 restore 和 dump 命令。有谁知道如何解决这个问题或我可以通过其他方式实现我的目标?
好的,我发现问题是当用户已经存在时,我没有提交数据库,导致连接没有关闭,当我尝试创建另一个时(即使用 mysql 命令),后者永远等待第一个命令结束。
要防止这种情况:提交或关闭与数据库的连接,或者在创建另一个与数据库的连接之前关闭游标(或使用相同的游标进行恢复)。
我正在对一个在数据库中保存条目的程序进行单元测试"mydatabase"。因此,我需要在测试每个功能后恢复数据库,以免其他测试受到影响。我试着用os.system()写了一个mysql命令来恢复。以下是程序的相关部分:
class testSql(unittest.TestCase):
def setUp(self,
dbName = "mydatabase",
existingUser = "John",
nonExistingUser = "thisnamedoesnotexist",
):
os.system('mysql -u root -ppassword mydatabase < "mypath/schema.sql"')
self.dbName = dbName
self.existingUser = existingUser
self.nonExistingUser = nonExistingUser
def test_signUp(self):
self.assertFalse(sql.userExists(self.nonExistingUser))
sql.signUp(self.nonExistingUser,"password")
self.assertTrue(sql.userExists(self.nonExistingUser))
当我 运行 程序时,然而,而不是显示测试结果,我只看到 mysql 命令的结果,终端冻结,所以我不能输入任何内容并强制关闭它:Result from terminal
我尝试了什么:用 os.system 创建一个函数并调用它;导入具有该功能的文件;使用 exec() 函数通过语句执行文件;正在导入文件以执行语句。
显然,os.system("mysql -u root -ppassword") 工作得很好,但不是 restore 和 dump 命令。有谁知道如何解决这个问题或我可以通过其他方式实现我的目标?
好的,我发现问题是当用户已经存在时,我没有提交数据库,导致连接没有关闭,当我尝试创建另一个时(即使用 mysql 命令),后者永远等待第一个命令结束。
要防止这种情况:提交或关闭与数据库的连接,或者在创建另一个与数据库的连接之前关闭游标(或使用相同的游标进行恢复)。