我正在尝试使用Selenium和Python测试webapp。该应用程序有一个非常方便的数据库备份实用程序。目前,我有一个大类RegressionTest(unittest.TestCase)
,它利用setUpClass()
和tearDownClass()
在测试完成之前执行数据库备份,并在测试结束后恢复。这一切都很有效,但我真的喜欢将这些测试分成多个类(每个测试类都有自己的文件)但是我找不到好的在不重复备份/恢复操作的情况下执行此操作的方法。
更复杂的是,我想添加以下限制:
这需要在我的TeamCity CI服务器上启用(目前使用python3 -m teamcity.unittestpy
,但只要我继续获得测试报告,我就可以灵活调用)并通过PyCharm的标准单元测试运行配置。不幸的是,当通过PyCharm调用时,'__main__' == __name__
似乎评估为False
,这排除了像这样的上下文管理器的可能性:
if '__main__' == __name__:
with BackupManager():
if seleniumutils.is_running_under_teamcity():
runner = TeamcityTestRunner()
else:
runner = unittest.TextTestRunner()
unittest.main(testRunner=runner)
这是PyCharm正在执行的行:
/usr/bin/python3 /Path/To/PyCharm/Installation/helpers/pycharm/_jb_unittest_runner.py --path /Path/To/Project/Test/Code/testregression.py
以下是我现在正在使用的PyCharm版本中_jb_unittest_runner.py
的确切版本:https://github.com/JetBrains/intellij-community/blob/3486b93168677dbc2519a78f472039bc50ca78be/python/helpers/pycharm/_jb_unittest_runner.py
我无法想到任何可以让我这样做的事情。我想也许多重继承可能有所帮助,就像那样丑陋。但是,我无法想出任何可能导致每次测试被调用至少两次的情况。
那么,任何人都可以提出一个解决方案,允许我在测试之前和之后完成一次动作吗?
答案 0 :(得分:2)
如果您希望每个测试模块运行一次数据库备份,则可以考虑使用setUpModule()
和tearDownModule()
函数。
Python unittest
将在模块级别声明每个模块时执行一次setUpModule()
和tearDownModule()
函数。
PyCharm将在使用unittestrunner进行配置时运行它们,我会想象TeamCity也将使用unittest
。