2017-06-04 11 views
6

Tôi đang làm việc với Selenium 3.4.0 với Python 3.6.1. Tôi đã viết một kịch bản theo tài liệu Python thông qua mô-đun unittest là một Python được xây dựng dựa trên sốcủa Java sử dụng geckodriver 0.16.1 và Mozilla Firefox 57.0 trên máy Windows 8 Pro, hệ điều hành 64 bit, bộ xử lý x-64. Trong phương pháp thử nghiệm của tôi test_search_in_python_org() tôi có các dòng sau đó hoạt động tốt:Selenium3.4.0-Python3.6.1: Trong Selenium-Python ràng buộc bằng cách sử dụng unittest làm thế nào để quyết định khi nào nên sử dụng self.assertIn hoặc khẳng định

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 

Khi tôi đang khẳng định "tiêu đề trang" Tôi đang sử dụng: self.assertIn("Python", driver.title)

Nhưng, khi tôi khẳng định một chuỗi (giả định của tôi), trong nguồn trang tôi đang sử dụng: assert "No results found." not in driver.page_source

Câu hỏi của tôi là các yếu tố/điều kiện quyết định liệu tôi có nên sử dụng self.assertIn hoặc chỉ đơn giản là assert?

Mọi đề xuất hoặc con trỏ sẽ hữu ích.

+0

Kiểm tra [this] (https://stackoverflow.com/questions/2958169/what-are-the-advantages-or-difference-in-assert-false-and-self-assertfalse) câu hỏi – Andersson

Trả lời

5

Nhìn vào Python unittestdocumentation và cũng nhớ lại từ loạt các unittests Django mà tôi đã từng phải làm ở đây, là phát hiện của tôi.

SỬ DỤNG TRƯỜNG HỢP:

Điều đầu tiên đó là điều đơn giản nhất và theo ý kiến ​​của tôi là sự khác biệt lớn nhất giữa hai, là các trường hợp mà bạn có thể sử dụng mỗi lệnh. Cả hai đều có thể sử dụng thay thế cho nhau trong trường hợp của một lớp thử nghiệm, tuy nhiên, để sử dụng lệnh assertIn, bạn cần phải nhập thư viện unittest. Vì vậy, hãy nói rằng tôi muốn biết nếu h nằm trong số hello. Một cách đơn giản để làm điều đó thông qua các lệnh assertIn là:

class MyTestCase(unittest.TestCase): 
    def is_h_in_hello(self): 
     self.assertIn("h", "hello") 

và sau đó tôi cần phải chạy thử nghiệm, đó là thông qua unittest.main() trong ví dụ này, để có được câu trả lời của tôi. Nhưng sử dụng lệnh assert, sẽ dễ dàng hơn để xem liệu h có nằm trong số hello hay không. Việc này rất đơn giản được thực hiện như vậy:

assert "h" in "hello" 

Nhưng về cơ bản, cả hai sẽ cho tôi cùng một câu trả lời. Tuy nhiên, những gì phân biệt hai phương pháp là sự đơn giản của việc sử dụng trong phương pháp thứ hai.

KẾT QUẢ:

Sự khác biệt thứ hai tôi thấy được khả năng đọc các kết quả trên Python Shell. Thư viện unittest được thiết kế để các lệnh rất cụ thể. Vì vậy, nếu một bài kiểm tra thất bại, bạn sẽ nhận được một thông điệp rất rõ ràng nói rằng những gì đã đi sai. Giả sử bạn muốn xem liệu b có nằm trong số hello hay không. Làm việc đó thông qua các phương thức lớp (chỉ đơn giản là thay đổi "h"-"b"), thông điệp chúng tôi nhận được sau khi chạy thử nghiệm là:

AssertionError: 'b' not found in 'hello' 

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

FAILED (failures=1) 

Vì vậy, nó nói rất rõ ràng bạn: 'b' not found in 'hello', mà làm cho nó rất thuận tiện để xem những gì chính xác là vấn đề. Nhưng giả sử bạn thực hiện quá trình tương tự thông qua lệnh assert.Các thông báo lỗi được tạo ra là một cái gì đó như:

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

Mặc dù nó sẽ cho bạn biết các loại lỗi (AssertionError), và traceback, nó không đặc biệt nói với bạn rằng "b" is NOT in "hello". Trong trường hợp đơn giản này, thật dễ dàng để nhìn vào điểm traceback và nói oh, không có b trong hello! Tuy nhiên trong các trường hợp phức tạp hơn, có thể khó hiểu tại sao thông báo lỗi này được tạo ra. Nhìn chung, hai phương pháp rất giống nhau và sẽ mang lại cho bạn kết quả mà bạn muốn, nhưng về cơ bản nó có sự khác biệt nhỏ ở đây và ở đó, có ít dòng mã hơn và thông điệp Shell thẳng tiến như thế nào.

+1

Cảm ơn bạn rất nhiều các chi tiết. – DebanjanB

0

Theo tôi, khẳng định là từ khóa được xây dựng trong python cho biết trạng thái nội bộ của chương trình. Nói cách khác, với từ khóa khẳng định, bạn có thể cho biết hành vi mã của bạn. Trong trường hợp của bạn, bạn không nên sử dụng khẳng định trong testcase.

+0

Ý tôi là, khi bạn đang viết thử nghiệm sử dụng self.assert, nếu không thì hãy sử dụng khẳng định – Erdenezul

Các vấn đề liên quan