当前位置: 首页 > 面试题库 >

如何在Python Selenium中实现类似TestNG的功能或在一个测试套件中添加多个单元测试?

幸阳波
2023-03-14
问题内容

假设我有这两个鼻子测试ExampleTest1.py和ExampleTest2.py

 ExampleTest1.py
 class ExampleTest1(TestBase):
            """
            """

        def testExampleTest1(self):
            -----
            -----

    if __name__ == "__main__":
        import nose
        nose.run()

---------------
ExampleTest2.py
class ExampleTest2(TestBase):
        """
        """

        def testExampleTest2(self):
            -----
            -----

    if __name__ == "__main__":
        import nose
        nose.run()

现在,我想从一个套件中运行数百个测试文件。

我正在寻找类似TestNG功能的东西,例如testng.xml,在这里我可以添加所有应该逐个运行的测试文件

 <suite name="Suite1">
      <test name="ExampleTest1">
        <classes>
           <class name="ExampleTest1" />          
        </classes>
      </test>  
      <test name="ExampleTest2">
        <classes>
           <class name="ExampleTest2" />          
        </classes>
      </test>  
    </suite>

如果python中没有testng.xml之类的功能,那么创建测试套件并在其中包含我所有的python测试的其他选择是什么?谢谢


问题答案:

鉴于您可能要构建测试套件的原因可能有多种,我将提供几种选择。

仅从目录运行测试

假设有mytests目录:

mytests/
├── test_something_else.py
└── test_thing.py

从该目录运行所有测试很容易

$> nosetests mytests/

例如,您可以将烟雾测试,单元测试和集成测试放入不同的目录中,但仍然可以运行“所有测试”:

$> nosetests functional/ unit/ other/

通过标签运行测试

nose.有属性选择器插件。用这样的测试:

import unittest

from nose.plugins.attrib import attr


class Thing1Test(unittest.TestCase):

    @attr(platform=("windows", "linux"))
    def test_me(self):
        self.assertNotEqual(1, 0 - 1)

    @attr(platform=("linux", ))
    def test_me_also(self):
        self.assertFalse(2 == 1)

您将能够运行具有特定标签的测试:

$> nosetests -a platform=linux tests/

$> nosetests -a platform=windows tests/

运行手动构建的测试套件

最后,nose.main支持suite参数:如果传递了,则 发现不会完成。在这里,我为您提供了有关如何手动构造测试套件然后使用Nose运行它的基本示例

#!/usr/bin/env python

import unittest

import nose


def get_cases():
    from test_thing import Thing1Test
    return [Thing1Test]


def get_suite(cases):
    suite = unittest.TestSuite()
    for case in cases:
        tests = unittest.defaultTestLoader.loadTestsFromTestCase(case)
        suite.addTests(tests)
    return suite


if __name__ == "__main__":
    nose.main(suite=get_suite(get_cases()))

如您所见,nose.main获得unittest由构造并返回的常规测试套件get_suite。该get_cases功能是您选择的测试用例被“加载”的地方(例如,上面的案例类仅被导入)。

如果您确实需要XML,get_cases则可以在这里返回从通过解析的XML文件获得的模块(通过__import__
导入importlib.import_module)获得的案例类。在nose.main通话附近,您可以argparse用来获取XML文件的路径。



 类似资料:
  • 我正在尝试运行配置套件文件的并行测试。测试是针对使用Selenium的web应用程序。套件文件由多个测试组成。每个测试都包含多个测试类。每个测试中的第一个类用于初始化(@beforetest)WebDriver并关闭它(@aftertest)。WebDriver是静态的,以便将其传递给其他类(原因是我们需要从最后一个测试类结束的地方继续测试)。 当套件配置为按顺序运行测试时,测试将成功运行。但是当

  • 我想在多个浏览器中运行同一组测试用例。为此,我将测试(每个测试针对单个浏览器)放在testng xml的一个套件下。运行之后,我从testng获得一个html报告,如果其中一个浏览器中出现测试失败,它在报告中不可见。还有别的办法吗?

  • 我使用PyCharm来运行一个相当大的测试套件(1800个快速测试)。最近修改了一个测试,我意识到我的测试不会出错。当我单独运行这些测试时,确实会中断,但是如果我运行整个测试套件,它们总是会通过。这是由于一些以前的同事对类的这种不正确的嘲笑: 我现在需要检查整个测试套件中模拟的使用情况,但是我想单独运行每个测试,看看哪些测试没有通过(我将这些测试标记为高优先级)。我怎么能从控制台或Py魅力中做到这

  • 我需要在一次测试中执行所有3个类,并满足以下要求: > 仅从Class1执行test1和test3。 仅从Class2执行test2。 执行Class3中的所有测试。 2类 3类 为此,我使用了以下testNg xml,但无论我是否包含该组,都将执行Class 1和Class 3中的所有测试。 如果我希望执行上述类文件,请建议TestNg xml文件的正确语法。

  • 问题内容: 我在python中有以下代码 我的问题是在test_home_page函数之后,firefox实例关闭并为下一个test_whatever函数再次打开。我该怎么做,以便所有测试用例都从同一firefox实例执行。 问题答案: 在以下位置初始化firefox驱动程序: