Selenium3.4.0-Python3.6.1:在使用unittest的Selenium-Python绑定中如何决定何时使用self.assertIn或assert

Deb*_*anB 7 python junit selenium python-3.x selenium-webdriver

我正在使用Selenium 3.4.0和Python 3.6.1.我在Python文档之后编写了一个脚本文件,unittest这是一个基于Java的内置Python,JUnit在Windows 8 Pro机器,64位操作系统,x-64处理器上使用geckodriver 0.16.1和Mozilla Firefox 57.0.在我的测试方法中,test_search_in_python_org()我有以下几行,效果很好:

    def test_search_in_python_org(self):
      driver = self.driver
      driver.get("http://www.python.org")
      self.assertIn("Python", driver.title)
      elem = driver.find_element_by_name("q")
      elem.send_keys("pycon")
      elem.send_keys(Keys.RETURN)
      assert "No results found." not in driver.page_source
Run Code Online (Sandbox Code Playgroud)

当我断言我正在使用的"页面标题"时: self.assertIn("Python", driver.title)

但是,当我断言一个字符串(我的假设)时,在我使用的页面源代码中: assert "No results found." not in driver.page_source

我的问题是决定我是应该使用self.assertIn还是仅仅使用的因素/条件是什么 assert

任何建议或指示都会有所帮助.

coo*_*ugh 4

查看 Pythonunittest 文档并回想起我曾经必须在这里做的一堆 Django 单元测试,这是我的发现。

使用案例:

首先,这是最简单的事情,在我看来,两者之间最大的区别是您可以使用每个命令的情况。在测试类的情况下,它们都可以互换使用,但是,为了使用该assertIn命令,您需要导入unittest库。所以,假设我想知道是否h在 中hello。通过命令执行此操作的一个简单方法assertIn是:

class MyTestCase(unittest.TestCase):
    def is_h_in_hello(self):
        self.assertIn("h", "hello")
Run Code Online (Sandbox Code Playgroud)

然后我需要运行测试(unittest.main()在本例中就是这样),以获得我的答案。但使用该命令,查看是否在 中assert要容易得多。这样做非常简单,如下所示:hhello

assert "h" in "hello"
Run Code Online (Sandbox Code Playgroud)

但本质上,两者都会给我相同的答案。然而,这两种方法的区别在于第二种方法的使用简单性。

结果:

我发现的第二个区别是 Python Shell 上结果的可读性。该unittest库的设计使得命令非常具体。因此,如果测试失败,您将收到一条非常明确的消息,说明出了什么问题。现在说您想查看是否b在 中hello。通过类方法执行此操作(只需更改"h""b"),运行测试后我们得到的消息是:

AssertionError: 'b' not found in 'hello'

----------------------------------------------------------------------
Ran 1 test in 0.038s

FAILED (failures=1)
Run Code Online (Sandbox Code Playgroud)

所以它很清楚地告诉你:'b' not found in 'hello',这样可以很方便的看出到底是什么问题。但是假设您通过命令执行相同的过程assert。生成的错误消息类似于:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    assert "b" in "hello"
AssertionError
Run Code Online (Sandbox Code Playgroud)

虽然它告诉您错误类型 ( AssertionError) 和回溯,但它并没有具体告诉您"b" is NOT in "hello"。在这个简单的例子中,很容易查看回溯并说哦,hello 中没有 b!然而,在更复杂的情况下,可能很难弄清楚为什么会生成此错误消息。

总体而言,这两种方法非常相似,并且都会得到您想要的结果,但本质上它归结为各处的细微差别、代码行数较少以及 Shell 消息的直接性。