我正在使用Selenium 3.4.0和Python 3.6.1。我通过unittest模块按照Python文档编写了脚本,该模块是基于gojiodriver 0.16.1和Mozilla Firefox 57.0在Windows 8 Pro计算机,64位OS,x-64处理器上基于Java的JUnit的内置Python。在我的测试方法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

当我断言“页面标题”时,我使用的是:self.assertIn("Python", driver.title)
但是,当我声明一个字符串(我的假设)时,在页面源中使用的是:assert "No results found." not in driver.page_source
我的问题是什么因素/条件决定了我应该使用self.assertIn还是简单地使用assert

任何建议或指示将对您有所帮助。

最佳答案

看一下Python的unittest documentation,并且还从我曾经在这里进行的一系列Django单元测试中回想起了我的发现。
使用案例:
第一件事是最简单的事情,而我认为两者之间最大的不同是可以使用每个命令的情况。在测试类的情况下,它们都可以互换使用,但是,为了使用assertIn命令,您需要导入unittest库。
所以,说我想知道h是否在hello中。通过assertIn命令执行此操作的简单方法是:

class MyTestCase(unittest.TestCase):
    def is_h_in_hello(self):
        self.assertIn("h", "hello")
然后我需要运行测试,即通过本示例中的unittest.main()来获得答案。
但是,使用assert命令,可以更轻松地查看h是否在hello中。这样做非常简单:
assert "h" in "hello"
但从本质上讲,两者都会给我相同的答案。但是,两种方法的区别在于第二种方法的使用简便性。
结果:
我发现的第二个区别是结果在Python Shell上的可读性。设计unittest库是为了使命令非常具体。因此,如果测试失败,您将收到一条非常清晰的消息,指出出了什么问题。现在说,您想看看b是否在hello中。通过类方法(只需将"h"更改为"b")进行操作,运行测试后得到的消息是:
AssertionError: 'b' not found in 'hello'

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

FAILED (failures=1)
因此,它非常清楚地告诉您:'b' not found in 'hello',这使您很方便地看到问题出在哪里。但是说您通过assert命令执行相同的过程。生成的错误消息是这样的:
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    assert "b" in "hello"
AssertionError
尽管它告诉您错误类型(AssertionError)和回溯,但它没有专门告诉您"b" is NOT in "hello"。在这种简单的情况下,很容易查看回溯并说哦,您好!但是,在更复杂的情况下,要弄清为什么会生成此错误消息可能会很棘手。
总体而言,这两种方法非常相似,可以为您带来所需的结果,但是从本质上讲,这归因于此处和此处的微小差异,更少的代码行以及Shell消息的直接性。

10-06 07:26
查看更多