Nhìn vào Python unittest
documentation 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.
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