Làm thế nào để tôi đơn vị kiểm tra một trang web mẫu?


26

Làm thế nào để tôi đơn vị kiểm tra một trang web mẫu? Dường như với tôi rằng rất nhiều phụ thuộc vào đầu vào của nhà nước và người dùng, điều đó sẽ không khả thi.

Nếu nó không khả thi thì có một sự thay thế tự động hợp lệ không?


2
Nếu bạn muốn kiểm tra giao diện người dùng tự động, thì bạn sẽ cần một cái gì đó như Selenium. Nhưng, nếu bạn muốn thử nghiệm đơn vị tự động , thì bạn không cần Selenium. Bạn chỉ cần đúng mẫu tại chỗ. Xem câu trả lời của tôi.
Matthew Rodatus

Câu trả lời:


22

Vâng, bạn có thể. Bạn chỉ cần cẩn thận để phân tách mối quan tâm của bạn tốt. Nói tóm lại, bạn phải loại bỏ tất cả logic của bạn khỏi mã phía sau và đưa nó vào các lớp khác.

Có hai cách phổ biến để làm điều này.

Cách đơn giản là suy nghĩ lại về tất cả các trình xử lý sự kiện của bạn theo nghĩa "Hệ thống cung cấp cho tôi thông tin gì? Tôi cần thông tin gì để điền vào trang?" và sau đó cung cấp một lớp dịch vụ thực hiện chuyển đổi đó.

Trong trường hợp này, lớp dịch vụ nên biết rất ít về bản chất của lớp trình bày của bạn. Bạn vẫn phải lấy dữ liệu được trả về từ dịch vụ và điền các thành phần chính xác của WebForm vào mã phía sau của bạn và điều này vẫn chưa được kiểm tra (ít nhất là bằng các bài kiểm tra đơn vị, bạn vẫn có thể sử dụng các bài kiểm tra tích hợp). Nhưng điều này hiếm khi xảy ra khi mã bị lỗi, nó có nhiều khả năng thất bại trong logic.

Một cách phức tạp hơn, nhưng hiệu quả hơn, là sử dụng mẫu Trình xem mô hình . Khi chúng tôi thử điều đó, chúng tôi thấy rằng Người thuyết trình nhanh chóng trở nên rất hợp với khuôn khổ và, chúng tôi càng phát triển MVP, thì rõ ràng MVP thực sự muốn trở thành MVC nhưng không thể.

Điều đó nói rằng, những người khác đã thực hiện điều này rất thành công - thậm chí còn có một khung webformsmvp có sẵn để loại bỏ việc nâng vật nặng - vì vậy số dặm của bạn có thể thay đổi.


1
@jmoreno: Bắt đẹp quá! Tôi đã quên WebForms và MVP thậm chí tồn tại trong 5 năm qua.
pdr

16

Rõ ràng, toàn bộ trang biểu mẫu web không phải là một đơn vị và do đó không thể được kiểm tra đơn vị. Tuy nhiên, có một số điều bạn có thể làm cho các bài kiểm tra tự động:

  • kiểm tra đơn vị các thành phần riêng lẻ của trang (bất kỳ phương pháp nào thực hiện logic thực tế)
  • các thành phần kiểm tra đơn vị được sử dụng bởi trang (điều khiển tùy chỉnh, logic nghiệp vụ cơ bản, v.v.)
  • kiểm tra chức năng tự động (bằng cách điều khiển từ xa trình duyệt hoặc gửi yêu cầu HTTP thông qua một cái gì đó như cURL)
  • kiểm tra thâm nhập tự động (có những công cụ sẽ cố gắng tìm các điểm tiêm có thể và tự động chạy các cuộc tấn công tiêm vô hại nhưng có thể phát hiện được trên trang của bạn)
  • thử tải
  • kiểm tra bố cục dựa trên danh sách các điểm đạn khả dụng và kiểu nhà (mặc dù điều này rất khó tự động hóa; thường sẽ khả thi hơn nếu chỉ thực hiện thủ công mỗi giờ)

-1 Xin lỗi nhưng Kiểm tra tải, kiểm tra thâm nhập và kiểm tra bố cục không liên quan gì đến kiểm tra đơn vị
Tom Squires

2
@TomSquires: tất nhiên là không phải, và nếu bạn đọc kỹ câu trả lời của tôi, bạn sẽ nhận thấy rằng tôi chưa bao giờ nói họ như vậy. Nhưng câu hỏi dường như nhầm lẫn giữa các khái niệm về kiểm tra đơn vị và kiểm tra tự động nói chung, đó là lý do tại sao tôi liệt kê các thử nghiệm tự động có ý nghĩa khác nhau mà bạn có thể ném vào một biểu mẫu web.
tdammers

đồng ý, kiểm tra một trang web có nhiều khả năng là một hình thức kiểm tra tích hợp sau đó kiểm tra đơn vị theo các định nghĩa nghiêm ngặt, mặc dù vẫn tốt để tự động hóa bất cứ điều gì bạn có thể
jk.

6
@TomSquires: downvote hoàn toàn không chính đáng. Câu hỏi của riêng bạn bắt đầu bằng việc kiểm tra toàn bộ trang web, không liên quan gì đến kiểm tra đơn vị. Tdammers đã xác định nhiều cách khác nhau để kiểm tra toàn bộ và các bộ phận và xác định nơi thử nghiệm đơn vị phù hợp. +1
azheglov

3
Đủ công bằng. Tôi lấy lại
Tom Squires

9

Tôi xin lỗi vì đã bỏ lỡ phần "đơn vị" của câu hỏi ...

SeleniumHQ là bạn của bạn để kiểm tra từ mặt trước. Nó không phải là một bài kiểm tra đơn vị, giống như một bài kiểm tra hộp đen. Bạn vẫn cần nghĩ về các trường hợp kiểm tra hợp lệ ...


1
+1 Câu trả lời của bạn được đưa ra khi tôi nhấn "đăng câu trả lời của bạn" để nói chính xác như vậy.
yannis

2
Ngoài ra, vì op đang hỏi về kiểm thử đơn vị, chúng ta hãy thêm rằng câu hỏi thực sự là gì về kiểm tra chức năng (ity) , điều này phù hợp hơn (hợp lý, khả thi) khi kiểm tra các yếu tố đầu vào của người dùng.
yannis

+1 cos Tôi giữ ý nghĩa để sử dụng nó, nhưng không bao giờ hoàn thành nó. Có ai đã sử dụng nó, nó có tốt và đáng để thực hiện không?
NimChimpsky

6
Selenium là một công cụ tuyệt vời nhưng nó không liên quan gì đến thử nghiệm đơn vị.
pdr

Đúng, có vẻ như tôi đã bỏ qua thông tin này trong câu hỏi: /
WarrenFaith

6

Phát biểu từ kinh nghiệm: Chỉ khi nó được thực hiện đúng. Theo "đúng", ý tôi là mã phía sau tối thiểu và một cái gì đó giống như Model-View-Presenter đã đề cập ở trên để làm cho Mẫu Web "câm". Điều này thường tỏ ra rất khó khăn với các ứng dụng brownfield vì chúng không được thiết kế với ý tưởng này và đó là một nỗ lực gần như của Herculean để tái cấu trúc / viết lại các trang để sử dụng nó.


1

watin

Tôi thấy các bài kiểm tra web đơn vị cực kỳ hữu ích, ngay cả khi đó chỉ là để đưa ra ý tưởng chung về lỗi hồi quy hoặc cho các dự án mới.

Theo như trạng thái có liên quan, bạn tạo các bài kiểm tra đơn vị của mình như với các bài kiểm tra không phải UI - họ xóa cơ sở dữ liệu khi bắt đầu kiểm tra và xây dựng lại cơ sở dữ liệu để không chứa gì ngoại trừ trạng thái bắt đầu. Mỗi bài kiểm tra đơn vị sau đó gói gọn một trang hoặc thường là một tác vụ riêng biệt trên một trang.

http://watin.org/ là một công cụ kiểm tra web khác nhưng dành cho C # /. NET. Bạn viết các bài kiểm tra dưới dạng bài kiểm tra đơn vị:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

Hiện tại nó dựa trên IE nhưng có một số hỗ trợ thử nghiệm cho Firefox và Chrome. Bạn có thể tự động hóa khá nhiều bất cứ điều gì bạn sẽ làm trong các bài kiểm tra thủ công, bao gồm cả tương tác Javascript.


Ack rằng đó là năm 2016. Chuyến thăm hôm nay đến trang web của WatiN cho tôi biết rằng WatiN có lẽ đã chết. Các tài liệu rất thưa thớt, không cập nhật và video không phát. Tôi không phàn nàn - tôi rất biết ơn các công cụ tự nguyện nguồn mở - nhận xét này là để giúp đỡ những người đến gần đây như tôi. Câu trả lời là tốt, chỉ cần chỉ ra rằng bắt đầu có thể yêu cầu tự học thực hành.
qxotk

1
Trợ giúp thêm cho bất cứ ai nghĩ về cách WatiN, xác nhận nó bị trì trệ + nơi để tìm trong ngày hôm nay tại đây: stackoverflow.com/questions/118531/
Lỗi

0

Bạn thực sự không thể kiểm tra một trang web, đơn giản vì các yêu cầu web xảy ra trên một dây (hoặc thông qua ngăn xếp TCP). Do đó, các bài kiểm tra không phù hợp với định nghĩa của "bài kiểm tra đơn vị", rất có thể, chúng sẽ là các bài kiểm tra đầu cuối.

Đối với các loại thử nghiệm đó, bạn có thể sử dụng một bộ như Selenium chạy trình duyệt web phía sau hậu trường. Một lời cảnh báo mặc dù: thông thường loại thử nghiệm này là rất khó khăn và không thể đoán trước, vì có nhiều phần di chuyển!

Thú vị hơn nữa, nó làm tôi lo lắng một chút tại sao bạn lại cần phải kiểm tra các mẫu web. Không phải bạn đã đặt quá nhiều logic vào mã phía sau và có logic kinh doanh thiếu máu nào không?


-1

Hoa nhài

Trong 5 năm qua, Jasmine đã nổi lên như một công cụ chính cho các bài kiểm tra đơn vị mặt trước. Nó thường được tích hợp vào thử nghiệm xây dựng tự động với Node và npm

Mỗi https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) :

Jasmine là một khung kiểm tra mã nguồn mở cho JavaScript. [2] Nó nhằm mục đích chạy trên bất kỳ nền tảng hỗ trợ JavaScript nào, không xâm nhập vào ứng dụng cũng như IDE và để có cú pháp dễ đọc. Nó bị ảnh hưởng nặng nề bởi các khung thử nghiệm đơn vị khác, chẳng hạn như VítUnit, JSSpec, JSpec và RSpec. [3]

Mặc dù tất cả các đề cập về javascript, nó cũng có thể được sử dụng để kiểm tra đơn vị của một hình thức web đơn giản.


Mặc dù javascript được sử dụng trong các biểu mẫu web nhưng đây không phải là phương pháp chính để cập nhật ui
Tom Squires

Thật. Tuy nhiên, sự thay thế là ...? Vì vậy, đó là lý do tại sao, mặc dù không nhằm mục đích, Jasmine hoạt động rất tốt. Cộng với cú pháp gần giống với RSpec mà các lập trình viên Ruby yêu thích.
Michael Durrant

-2

ASP.NET

Khi phát triển một trang web ASP.NET, chúng tôi có thể chạy thử nghiệm đơn vị trên:

  • Lĩnh vực
  • BL điều khiển / thuyết trình
  • cơ sở mã của các trang Web Forms

Có thể TDD tất cả điều này, tùy thuộc vào kiến ​​trúc của bạn. Điều duy nhất bạn không thể kiểm tra đơn vị là cách bố trí tệp đánh dấu.


3
Câu trả lời này nói "có, có thể" cho câu hỏi "làm thế nào". Không chính xác hữu ích.
RubberDuck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.