【发布时间】:2018-03-13 16:09:47
【问题描述】:
我正在尝试使用 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
我想不出任何可以让我这样做的东西。我想也许多重继承会有所帮助,尽管那会很丑陋。但是,我想不出任何场景不会让每个测试至少被调用两次。
那么,谁能想出一个解决方案,让我在测试前后只执行一次操作?
【问题讨论】:
-
你有没有考虑过不要弄乱你正在运行的开发数据库,而是将你的测试指向不同的数据库(内存中的 sqlite,你的开发数据库中的另一个模式,甚至是第二个 docker 容器你的测试脚本?)
-
我喜欢你的想法,但这会改变我的整个测试方式,并大大减慢测试代码重复周期。当然,我可以编写其中一些步骤的脚本,但这增加了我希望避免的另一层复杂性。由于这些是 selenium 测试,因此没有简单的方法可以将正在运行的应用程序实例交换到不同的数据库
标签: python pycharm python-unittest