【问题标题】:Python Unit Test Whole-Module SetupPython 单元测试全模块设置
【发布时间】: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


【解决方案1】:

如果您希望每个测试模块运行一次数据库备份,您可以考虑使用setUpModule()tearDownModule() 函数。

当在模块级别声明setUpModule()tearDownModule() 函数时,Python 的unittest 将为每个模块执行一次。

PyCharm 将在使用 unittestrunner 配置时运行这些,我想 TeamCity 也会运行这些,因为它在幕后使用 unittest

【讨论】:

  • 我认为这正是我正在寻找的,但我不确定是什么定义了单个“模块”的边界。你能解释一下吗?
  • 这里的边界是 .py 文件,其中包含您的测试类。因此,如果您计划将大型测试类重构为单独的模块(.py 文件),则意味着在每个模块中定义单独的setUpModule()tearDownModule() 函数。
  • 这真是太糟糕了,这意味着它几乎比使用 setUpClass()tearDownClass() 更好。我看到我的问题没有明确说明我希望每个文件有一个测试类,所以我会去编辑它。
  • 你可以把它放在你的测试目录下的 init.py 文件中,并且每个包也运行一次。
  • 现在这听起来正是我正在寻找的。您能否将其转换为答案并为此提供文档链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2020-10-04
相关资源
最近更新 更多