Tôi có cần phải kiểm tra tất cả mọi thứ?


28

Tôi sẽ bắt đầu dự án thực tế đầu tiên của mình trong Ruby on Rails , và tôi buộc bản thân phải viết các bài kiểm tra TDD . Tôi không thấy những lợi thế thực sự trong việc viết bài kiểm tra, nhưng vì nó có vẻ rất quan trọng, tôi sẽ thử.

Có cần thiết phải kiểm tra mọi phần trong ứng dụng của tôi, bao gồm các trang tĩnh không?


9
Đây thực sự không phải là một viên ruby ​​trên đường ray. đó là một câu hỏi TDD.
Jon Strayer

4
@JonStrayer: Phải không? Bạn có chắc chắn câu trả lời sẽ giống với RoR như .NET không? Tôi sẽ đề nghị rằng theo thiết kế, RoR đã cố tình giảm chi phí thử nghiệm, trong khi không có loại an toàn dưới dạng trình biên dịch ồ ạt làm tăng lợi ích của thử nghiệm.
pdr

1
Vì một số lý do, câu hỏi này khiến tôi muốn đăng một macro hình ảnh của Thuyền trưởng Nero hét lên "KIỂM TRA MỌI THỨ !!!"
Mason Wheeler

3
Không thấy lợi thế thực sự trong việc viết bài kiểm tra và viết chúng ra khỏi niềm tin mù quáng không thực sự đúng. Tiếp tục mà không viết bài kiểm tra, sau một thời gian bạn sẽ trải qua hồi quy bất ngờ và biết lý do tại sao bạn đang kiểm tra.
ZJR

1
Đợi cho đến khi bạn quyết định cấu trúc lại mã của bạn. Bất cứ khi nào thay đổi lớn được đưa ra, bạn cần xác minh chức năng. Nếu không có bài kiểm tra, bạn sẽ cần phải duyệt qua ứng dụng của mình và kiểm tra tất cả các chức năng theo cách thủ công. Giới thiệu một bản cập nhật lớn khác và bạn sẽ phải làm lại. Các bài kiểm tra đơn vị chỉ là một cách 'rẻ' để đảm bảo mọi thứ đều hoạt động như mong đợi.
Evan Plaice

Câu trả lời:


47

TDD không phải là về thử nghiệm, đó là về thiết kế. Viết các bài kiểm tra buộc bạn phải suy nghĩ về cách lớp được cho là hoạt động và loại giao diện bạn cần. Các xét nghiệm là một tác dụng phụ hạnh phúc giúp tái cấu trúc sau này dễ dàng hơn.

Vì vậy, với ý nghĩ đó, hành vi của một trang tĩnh là gì và giao diện là gì?

Phản hồi đầu tiên của tôi sẽ là "không" và "không".


Vì vậy, không có thử nghiệm cho các trang tĩnh?
Matteo Pagliazzi

TDD, ở một mức độ, về thiết kế. Nhưng bạn vẫn cần một kiến ​​trúc. Không có kiến ​​trúc trong tâm trí, thật khó để tưởng tượng người ta sẽ phát triển hữu cơ như thế nào trong một loạt các thử nghiệm.
Robert Harvey

@MatteoPagliazzi Tùy thuộc vào mức độ thử nghiệm (kiểm tra đơn vị / kiểm tra tích hợp / vv), có thể một hoặc hai, để xác nhận các trang tĩnh có thể truy cập được. Nhưng đó là mức độ quá cao cho các bài kiểm tra đơn vị.
Izkata

1
@RobertHarvey Tôi không nói đừng thử gì cả. Tôi nói không đơn vị kiểm tra các trang tĩnh.
Jon Strayer

@JonStrayer: TDD'ers có xu hướng giữ TDD như một số thuốc tiên cho thiết kế; Tôi xin lỗi nếu đó không phải là ý bạn. :)
Robert Harvey

32

Nó luôn luôn là một phân tích lợi ích chi phí. Chi phí của tính năng phá vỡ đối với bạn là gì? Nếu chi phí cao, sau đó kiểm tra tốt và kỹ lưỡng. Nếu chi phí thấp, kiểm tra nhẹ hoặc không.

Cũng có chi phí thời gian để xem xét thị trường. Có lẽ tốt hơn là bạn nên cung cấp một tính năng chủ yếu hoạt động hơn là trễ cung cấp một tính năng hoàn toàn hoạt động.

Hầu như không thể trả lời những câu hỏi này trong IMO chung.

Tôi nghĩ điều quan trọng hơn là duy trì khả năng kiểm tra trong trường hợp một số tính năng hóa ra quan trọng hơn bạn nhận ra ban đầu.


Ngoài ra, tôi cho rằng các lỗi trong một trang tĩnh sẽ dễ sửa hơn NHIỀU so với lỗi logic, lỗi thiết kế và loại điều TDD thường được sử dụng để ngăn chặn. Cả việc phát hiện và sửa lỗi của các trang tĩnh có thể khá dễ dàng và ấn tượng của tôi là TDD được sử dụng để rút ngắn cả hai quá trình đó khi chúng mất nhiều thời gian hơn mong muốn. : D
Gordon Gustafson

Tôi sẽ không cho rằng. Nếu bạn đã từng xử lý các hành vi phiên bản trình duyệt tối nghĩa hoặc các vấn đề bộ nhớ javascript lạ, bạn có thể đã tập luyện khá nhiều. Đôi khi vì ngôn ngữ back end có thể đáng tin cậy và chuẩn hơn một chút. đôi khi. Có lẽ bạn đang nói về tĩnh như trong html và không có javascript.
Michael Durrant

8

Tôi sẽ nói có". Nếu bạn có các bài kiểm tra bao gồm cả các tính năng và mã đơn giản nhất, thì bạn có thể tin tưởng rằng việc thêm mã mới không khiến mã tại chỗ ngừng hoạt động. Tương tự như vậy, đưa vào một bài kiểm tra cho mọi lỗi bạn gặp phải sẽ khiến cho hồi quy không bị lùi lại.


"Sau đó, bạn có thể tin tưởng rằng việc thêm mã mới không khiến mã tại chỗ ngừng hoạt động" theo cách đó tôi không nên chạm vào bất kỳ đoạn mã nào tôi đã viết trước đây và thêm phương thức mới?
Matteo Pagliazzi

Ồ không. Nhưng các phụ thuộc không lường trước và không lường trước giữa các mã hiện đang "hoạt động" có thể dẫn đến các vấn đề nếu bạn thêm mã mới làm thay đổi các phụ thuộc đó. Ngoài ra, nếu bạn làm bài kiểm tra sai, điều mà tôi nghĩ là khá phổ biến, bạn phải tự sửa đổi bài kiểm tra, và sau đó, có lẽ, sửa đổi mã phát sinh từ bài kiểm tra đó.
Bruce Ediger

@Andy Điều đó thật vô lý. Kiểm tra setters và getters tài sản là tầm thường và VITAL. Nếu họ không làm việc, nói chung cả lớp sẽ sụp đổ. Ví dụ: trong một ứng dụng đa luồng, nếu tập hợp không ngăn chặn được đồng thời, thì bạn sẽ gặp sự cố dữ liệu bị hỏng có thể mất hàng giờ để đi đến tận cùng, vì nguồn dữ liệu sẽ chính xác, nhưng kết quả nhận được sẽ không Hoặc nếu thiết lập của bạn không cập nhật thời gian cập nhật, thì dữ liệu của bạn có thể không thể đồng bộ hóa Bạn có ý tưởng. Nếu setters và getters thực sự là tầm thường, bạn chỉ có thể làm cho tài sản công khai
deworde

@deworde Tôi sợ làm cho các thành viên thể hiện chủ đề an toàn không phải là tất cả. Việc kiểm soát truy cập vào loại an toàn không phải là thông thường hơn là cố gắng làm cho chúng an toàn. Dù sao, những gì để kiểm tra là một điều có lợi về chi phí, như một câu trả lời khác nêu. bạn có thể dành thời gian viết bài kiểm tra cho getters hoặc setters hoặc bạn có thể kiểm tra hành vi thực tế mà hệ thống của bạn được cho là gói gọn.
Andy

3

Phải, bạn nên kiểm tra mọi thứ ...

Bạn sẽ không cần thiết để có thể viết bài kiểm tra tự động cho tất cả mọi thứ. Đối với các trang tĩnh của bạn, hãy xem xét sử dụng Selenium http://seleniumhq.org/ để đảm bảo mọi thứ đều chính xác.

Từ kinh nghiệm của tôi, một số thứ ở mặt trước không thể viết trường hợp kiểm tra nhưng đó là lý do tại sao bạn thực sự muốn kiểm tra bằng nhãn cầu Mark 1.


Tôi không đồng ý. Nếu bạn không thể thực hiện điều đó thông qua một bản giả hoặc truyền dữ liệu, thì tại sao lại có nó trong mã của bạn. Getters và setters không cần thử nghiệm riêng của họ sẽ được kiểm tra thông qua các thử nghiệm đơn vị khác của hệ thống để xác minh chức năng dự kiến.
Schleis

Chắc chắn, setters / getters được kiểm tra gián tiếp với các thử nghiệm khác nhưng khi ai đó nói "kiểm tra mọi thứ" tôi cho rằng họ có nghĩa là tạo ra các thử nghiệm đặc biệt cho những thứ đó. Tôi luôn nói với mọi người "kiểm tra những điều quan trọng." Những thứ như setters và getters không phù hợp với định nghĩa đó cho tôi.
Andy

2

Kiểm tra cũng quan trọng như mã hóa. Bạn phải nghe câu nói "Nếu một cái gì đó có thể đi sai, nó sẽ". INMO, Trong số nhiều kỹ thuật công nghệ phần mềm được sử dụng để nâng cao chất lượng, Kiểm thử là công cụ có giá trị nhất trong việc giúp bạn sớm phát hiện ra vấn đề.

Mặc dù thử nghiệm mọi thứ là không thể (đặc biệt với các nhóm nhỏ và hệ thống lớn), điều đó không có nghĩa là bạn bỏ qua việc kiểm tra hoàn toàn. Là thử nghiệm có giá trị nó? Xem phần "Tìm lỗi sớm" trong Xem Wiki-SoftwareTesting .


2

Các bài kiểm tra TDD cũng có thể là thông số kỹ thuật sống nếu được viết theo cách đó. Tên của các phương thức kiểm tra sẽ có ý nghĩa đối với người dùng doanh nghiệp.


2

Như những người khác đã đề cập, trong thử nghiệm Ruby on Rails, nó quan trọng hơn nhiều so với (hầu hết) các ngôn ngữ khác. Điều này là do thiếu một trình biên dịch.

Các ngôn ngữ như Delphi , C ++, VB.NET , v.v ... là các ngôn ngữ được biên dịch và trình biên dịch của bạn sẽ nhận được rất nhiều lỗi như lỗi chính tả trong các cuộc gọi đến một phương thức. Trong Ruby on Rails, bạn sẽ chỉ biết nếu có lỗi chính tả hoặc lỗi trong mã của mình nếu dòng mã cụ thể đó được chạy hoặc bạn đang sử dụng IDE hiển thị cảnh báo trực quan.

Vì MỌI dòng mã duy nhất rất quan trọng (nếu không nó sẽ ở đó), bạn nên kiểm tra mọi phương pháp bạn viết. Điều này đơn giản hơn nhiều so với âm thanh nếu bạn làm theo một số công cụ TBDD cơ bản.

Tôi thấy rằng Rails của Ryan Bates về cách tôi kiểm tra là vô giá đối với tôi và thực sự làm nổi bật sự đơn giản của TBDD nếu được thực hiện đúng.


1

Nếu bạn thực sự sử dụng phương pháp TDD thì bạn không viết mã mà không có bài kiểm tra đơn vị mà bạn đang cố gắng vượt qua.


2
có ... nhưng ví dụ trong một trang tĩnh, tôi nên kiểm tra cái gì? Sự tồn tại của nó? nội dung và liên kết tồn tại? có thể tôi sai nhưng có vẻ như lãng phí thời gian ...
Matteo Pagliazzi

1
Tôi có xu hướng nghĩ rằng phương pháp TDD được áp dụng cho logic của bạn. Trang tĩnh của bạn có phải là tệp html không? Một khung nhìn MVC không bao giờ thay đổi? Nếu trường hợp sau tôi đoán bạn có thể kiểm tra xem bộ điều khiển của bạn trả về chế độ xem phù hợp. Tôi nghĩ điều quan trọng hơn là hãy nhớ rằng TDD sẽ giúp bạn phát triển dựa trên đặc điểm kỹ thuật của bạn chứ không chỉ là "thử nghiệm" ...
wessiyad

Tôi giả sử bạn chỉ cần phục vụ một trang tĩnh với một thành phần của khung. Nếu không có phương pháp nào của bạn chạm vào trang đó, thực tế không có gì để kiểm tra. Bạn cũng không cần phải kiểm tra Rails. Tôi nghĩ ai đó có điều đó.
Erik Reppen

0

Tôi sẽ nói không bắt đầu với TDD. Đưa ra quyết định sáng suốt khi bạn dành nhiều thời gian hơn để học các chiến lược kiến ​​trúc nói chung. TDD sẽ không cho phép bạn bỏ qua bài tập về nhà đó mặc dù bạn có thể bắt đầu tin vào điều đó.

Đây là vấn đề của tôi với nó. Khi bạn nói có vẻ như rất nhiều thời gian lãng phí vào những thứ sẽ không bao giờ phá vỡ TDDers nói rằng bạn sẽ đánh giá cao điều đó khi một điều mà bạn không lường trước được trong một chuỗi phụ thuộc khổng lồ bị phá vỡ. Khi bạn chỉ ra rằng không thể dự đoán những điều như vậy trước khi bạn viết ứng dụng của mình, đó là ... tại sao chúng tôi kiểm tra, họ nói với bạn rằng đó thực sự là về thiết kế và không thử nghiệm mặc dù việc kiểm tra có ích.

Nhưng không phải chuỗi khổng lồ của sự phụ thuộc liên kết không thể đoán trước là sản phẩm của thiết kế nhảm nhí?

Vậy đó là cái gì?

Đây là một suy nghĩ. Trước tiên, chúng ta không có chuỗi phụ thuộc phức tạp lớn bằng cách xem xét hai nguyên tắc sau đây của thiết kế hướng đối tượng từ Mẫu thiết kế:

"Chương trình cho một giao diện, không phải là một triển khai"

Điều đó có nghĩa là, các đối tượng của bạn không nên quan tâm ai đang thực hiện cuộc gọi hoặc cách chúng được thực hiện. Chỉ có các đối số thích hợp được đưa vào và các phương thức mà họ gọi từ các đối tượng khác mà họ được hướng dẫn để làm việc như mong đợi. Chuỗi phụ thuộc của bạn trong hầu hết các trường hợp nên ở một điểm liên kết, cuộc gọi phương thức trên một phần của người gọi và vị trí nơi các đối số được đưa vào phương thức của bạn. Đó là nơi bạn đăng nhập và xác thực và gửi các thông báo hữu ích để gỡ lỗi khi mọi thứ tào lao.

Và:

"Thành phần đối tượng ủng hộ kế thừa lớp"

Ai là hình nộm? Anh chàng đã làm một cái gì đó cho một lớp trong một kế hoạch thừa kế xếp tầng phức tạp liên quan đến như 30 lớp dẫn đến phá vỡ trường hợp rìa, hoặc nhà phát triển đã đưa ra kiến ​​trúc đó ngay từ đầu? TDD có thể giúp bạn đi đến tận cùng của các vấn đề bên trong tòa tháp nghiêng lớp Pisa sớm hơn bạn có thể có nhưng điều đó có làm giảm bớt đau đớn khi cố gắng sửa đổi một trong những điểm cuối của thảm họa mã đó vào lần tới không?

Và đó là nơi tôi có được thứ khiến tôi phiền lòng. TDD có thực sự giúp thiết kế hay nó cho phép kiến ​​trúc xấu? Đối với tôi có vẻ như nó có tiềm năng trở thành một chiến lược tự hoàn thành. Nhóm của bạn càng không phải chịu trách nhiệm về kiến ​​trúc kém, các thành phần thử nghiệm chi tiết đó dường như trở nên hữu ích hơn, nhưng cuối cùng, ứng dụng của bạn trở thành một PITA ngày càng lớn hơn để làm việc (giả sử trước tiên họ không bao giờ nghĩ đến kiến ​​trúc địa điểm). Và việc không thừa nhận hậu quả của điều đó là điều tất yếu, luôn là lỗi đắt nhất bạn có thể mắc phải khi làm việc trên một ứng dụng có nghĩa là phải nâng cấp và sửa đổi theo thời gian.


-1

Để trả lời câu hỏi, hãy nghĩ về "điều gì có thể sai ở đây". Cụ thể, nếu bạn thay đổi "mã" (đánh dấu / bất cứ điều gì), làm thế nào bạn có thể tự tin rằng bạn đã không phá vỡ trang. Vâng, đối với một trang tĩnh:

  • nó có thể không kết xuất
  • nó có thể hiển thị không chính xác
  • JS có thể không tải
  • đường dẫn cho hình ảnh có thể không hoạt động
  • các liên kết có thể bị hỏng

Cá nhân, tôi muốn giới thiệu:

  • viết một bài kiểm tra selen [1] để kiểm tra một chuỗi bạn mong đợi trên trang (gần phía dưới nếu có thể). Điều này xác nhận rằng nó ám.
  • kiểm tra không có lỗi JS (tôi nghĩ rằng selen cho phép điều này)
  • chạy các trang tĩnh thông qua trình xác nhận html và nếu có thể, trình kiểm tra liên kết.
  • Tôi chưa tìm thấy một công cụ nào tôi muốn xác thực JS, nhưng bạn có thể tìm thấy thành công với jslint hoặc jshint.

Điều đáng nói ở đây là bạn muốn một cái gì đó có thể lặp lại, dễ sử dụng và sẽ tự động chạy trong trình chạy thử nghiệm của bạn.


-1

Chỉ cần thêm vào tất cả các câu trả lời đã xuất sắc, đây là suy nghĩ của tôi về những gì cần kiểm tra và những gì không cần kiểm tra:

Làm bài kiểm tra:

  • logic kinh doanh
  • logic ứng dụng
  • chức năng
  • hành vi,
  • vì vậy, tất cả mọi thứ, thực sự, ngoại trừ :

Đừng kiểm tra:

  • hằng số
  • thuyết trình

Vì vậy, không có điểm nào trong việc kiểm tra nói:

assert wibble = 3

và một số mã nói

wibble = 3

Và cũng không có điểm nào trong việc thử nghiệm những thứ mang tính trình bày, như liệu biểu tượng có màu xanh nhạt hay không, phông chữ nào bạn đã sử dụng cho tiêu đề, v.v.

Vì vậy, bạn hỏi, "tôi có nên kiểm tra các trang tĩnh không" và câu trả lời là: bạn kiểm tra chúng trong chừng mực vì chúng là một phần của chức năng, logic kinh doanh hoặc hành vi của trang web của bạn.

Vì vậy, trong ứng dụng của chúng tôi, chúng tôi có một bài kiểm tra kiểm tra các điều khoản & điều kiện có sẵn từ mọi phần của trang web - cho người dùng ẩn danh, cho người dùng đã đăng nhập, từ bảng điều khiển, bên trong màn hình ứng dụng, v.v. một liên kết được gọi là "điều khoản và điều kiện" trên mỗi trang, liên kết đó hoạt động và sau đó thử nghiệm nói rằng khi đến trang, nó "trông giống như" Ts & Cs - chỉ đủ để tự trấn an mình rằng đó là trang phù hợp, không có "kiểm tra hằng số" hoặc "kiểm tra bản trình bày" ... vì vậy bạn có thể kiểm tra xem văn bản có đúng không, chẳng hạn, mà không kiểm tra kích thước phông chữ cụ thể hoặc bố cục văn bản ...

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.