Chúng ta có nên kiểm tra tất cả các phương pháp của chúng tôi?


61

Vì vậy, hôm nay tôi đã nói chuyện với đồng đội của mình về thử nghiệm đơn vị. Toàn bộ sự việc bắt đầu khi anh ấy hỏi tôi "này, các bài kiểm tra cho lớp đó ở đâu, tôi chỉ thấy một bài?". Cả lớp là một người quản lý (hoặc một dịch vụ nếu bạn muốn gọi nó như vậy) và hầu như tất cả các phương thức chỉ đơn giản là ủy thác công cụ cho một DAO nên nó tương tự như:

SomeClass getSomething(parameters) {
    return myDao.findSomethingBySomething(parameters);
}

Một loại nồi hơi không có logic (hoặc ít nhất là tôi không coi sự ủy nhiệm đơn giản như logic) mà là một mẫu nồi hơi hữu ích trong hầu hết các trường hợp (tách lớp, v.v.). Và chúng tôi đã có một cuộc thảo luận khá dài về việc tôi có nên kiểm tra đơn vị hay không (tôi nghĩ rằng điều đáng nói là tôi đã hoàn toàn kiểm tra đơn vị DAO). Lập luận chính của anh ta cho rằng đó không phải là TDD (rõ ràng) và ai đó có thể muốn xem thử nghiệm để kiểm tra phương pháp này làm gì (tôi không biết làm thế nào nó có thể rõ ràng hơn) hoặc trong tương lai ai đó có thể muốn thay đổi triển khai và thêm logic mới (hoặc giống như "bất kỳ") nào vào nó (trong trường hợp đó tôi đoán ai đó nên đơn giản kiểm tra logic đó ).

Điều này làm tôi suy nghĩ, mặc dù. Chúng ta có nên phấn đấu cho% bảo hiểm thử nghiệm cao nhất? Hay đó chỉ đơn giản là một nghệ thuật vì nghệ thuật? Tôi chỉ đơn giản là không thấy bất kỳ lý do nào đằng sau việc thử nghiệm những thứ như:

  • getters và setters (trừ khi họ thực sự có một số logic trong đó)
  • mã "nồi hơi"

Rõ ràng một thử nghiệm cho một phương pháp như vậy (với giả) sẽ khiến tôi mất ít hơn một phút nhưng tôi đoán rằng vẫn còn lãng phí thời gian và một phần nghìn giây cho mỗi CI.

Có bất kỳ lý do hợp lý / không "dễ cháy" nào về lý do tại sao người ta nên kiểm tra từng dòng mã (hoặc nhiều nhất có thể) không?


2
Tôi vẫn đang quyết định về câu hỏi này, nhưng đây là cuộc nói chuyện của một người đã quyết định câu trả lời là "không". Ian Cooper: TDD, tất cả đã sai ở đâu Để tóm tắt cuộc nói chuyện tuyệt vời này, bạn nên thử nghiệm bên ngoài và thử nghiệm các hành vi mới không phải là phương pháp mới.
Daniel Kaplan

Đây thực sự là một cuộc nói chuyện tuyệt vời, phải xem, một cuộc nói chuyện mở mắt cho nhiều người, tôi thích nó. Nhưng tôi nghĩ rằng câu trả lời không phải là "không". Nó "có, nhưng gián tiếp". Ian Cooper nói về kiến ​​trúc lục giác và các tính năng / hành vi thử nghiệm chế giễu / khai thác các cổng. Trong trường hợp này, các cổng này là DAO và "người quản lý / dịch vụ" này được thử nghiệm không chỉ với thử nghiệm đơn vị riêng lẻ cho lớp này mà với "thử nghiệm đơn vị" (đơn vị theo định nghĩa của Ian Cooper mà tôi hoàn toàn đồng ý) kiểm tra một số tính năng trong miền của bạn sử dụng trình quản lý / dịch vụ này.
AlfredoCasado


Nó sẽ phụ thuộc vào hệ thống của bạn ở một mức độ nào đó, nếu bạn đang phát triển một hệ thống có chứng nhận an toàn ở mức độ trung bình đến cao, bạn sẽ cần phải bao gồm tất cả các phương pháp bất kể triviallity
jk.

Câu trả lời:


48

Tôi đi theo quy tắc ngón tay cái của Kent Beck:

Kiểm tra mọi thứ có thể phá vỡ.

Tất nhiên, đó là chủ quan ở một mức độ nào đó. Đối với tôi, getters / setters tầm thường và một lớp lót như của bạn ở trên thường không có giá trị nó. Nhưng sau đó, một lần nữa, tôi dành phần lớn thời gian để viết các bài kiểm tra đơn vị cho mã kế thừa, chỉ mơ về một dự án TDD trên cánh đồng xanh tốt ... Trên các dự án như vậy, các quy tắc là khác nhau. Với mã kế thừa, mục đích chính là bao quát càng nhiều nền tảng càng ít nỗ lực càng tốt, vì vậy các bài kiểm tra đơn vị có xu hướng ở cấp độ cao hơn và phức tạp hơn, giống như các bài kiểm tra tích hợp nếu một trong những thuật ngữ mang tính mô phạm. Và khi bạn đang vật lộn để có được phạm vi bảo hiểm mã tổng thể tăng từ 0%, hoặc chỉ xoay sở để vượt qua nó hơn 25%, đơn vị kiểm tra đơn vị và setters là lo lắng ít nhất của bạn.

OTOH trong một dự án TDD của Greenfield, việc viết các bài kiểm tra ngay cả đối với các phương pháp đó có thể là vấn đề thực tế hơn. Đặc biệt là khi bạn đã viết bài kiểm tra trước khi bạn có cơ hội bắt đầu tự hỏi "đây có phải là một dòng đáng để thử nghiệm không?". Và ít nhất những bài kiểm tra này là tầm thường để viết và chạy nhanh, vì vậy đó cũng không phải là vấn đề lớn.


Ah tôi hoàn toàn quên câu nói đó! Đoán tôi sẽ sử dụng nó như là đối số chính của tôi bởi vì thẳng thắn - những gì có thể phá vỡ ở đây? Không thực sự nhiều. Điều duy nhất có thể phá vỡ là lời gọi phương thức và nếu điều đó xảy ra hơn nó có nghĩa là điều gì đó thực sự tồi tệ đã xảy ra. Cảm ơn!
Zenzen

5
@Zenzen: "những gì có thể phá vỡ ở đây? Không thực sự nhiều." - Vì vậy, nó có thể phá vỡ. Chỉ là một lỗi đánh máy nhỏ. Hoặc ai đó thêm một số mã. Hoặc làm rối tung sự phụ thuộc. Tôi thực sự nghĩ rằng Beck sẽ tuyên bố rằng ví dụ chính của bạn đủ điều kiện là có thể phá vỡ. Getters và setters, ít hơn như vậy, mặc dù tôi đã nhận ra một lỗi sao chép / dán, ngay cả sau đó. Câu hỏi thực sự là, nếu nó quá tầm thường để viết một bài kiểm tra, tại sao nó thậm chí còn tồn tại?
pdr

1
Lượng thời gian bạn dành để nghĩ về nó đã có thể bạn đã viết bài kiểm tra. Tôi nói hãy viết bài kiểm tra, đừng rời đi khi không viết bài kiểm tra vì một khu vực màu xám, nhiều cửa sổ bị hỏng sẽ xuất hiện.
kett_chup

1
Tôi sẽ nói thêm rằng kinh nghiệm chung của tôi là việc kiểm tra getters và setters có phần có giá trị trong dài hạn, nhưng mức độ ưu tiên thấp. Lý do là vì tại sao bây giờ nó có cơ hội "không" tìm thấy lỗi, bạn không thể đảm bảo rằng nhà phát triển khác sẽ không thêm thứ gì trong ba tháng ("chỉ là một tuyên bố nếu đơn giản") sẽ có cơ hội phá vỡ . Có một bài kiểm tra đơn vị tại vị trí bảo vệ chống lại điều đó. Đồng thời, nó không thực sự là ưu tiên quá cao, bởi vì bạn sẽ không tìm thấy bất cứ điều gì sớm theo cách đó.
báo

7
Kiểm tra một cách mù quáng mọi thứ có thể phá vỡ không có ý nghĩa. Cần phải có một chiến lược mà các thành phần rủi ro cao được thử nghiệm đầu tiên.
CodeART

12

Có một số loại thử nghiệm đơn vị:

  • Nhà nước dựa. Bạn hành động và sau đó khẳng định chống lại trạng thái của đối tượng. Ví dụ tôi gửi tiền. Sau đó tôi kiểm tra xem số dư đã tăng chưa.
  • Trả về giá trị dựa trên. Bạn hành động và khẳng định chống lại giá trị trả lại.
  • Tương tác dựa trên. Bạn xác minh rằng đối tượng của bạn đã gọi một đối tượng khác. Đây dường như là những gì bạn đang làm trong ví dụ của bạn.

Nếu bạn đã viết bài kiểm tra của mình trước, thì nó sẽ có ý nghĩa hơn - như bạn mong đợi để gọi một lớp truy cập dữ liệu. Thử nghiệm ban đầu sẽ thất bại. Sau đó, bạn sẽ viết mã sản xuất để vượt qua bài kiểm tra.

Lý tưởng nhất là bạn nên kiểm tra mã logic, nhưng các tương tác (các đối tượng gọi các đối tượng khác) đều quan trọng như nhau. Trong trường hợp của bạn, tôi sẽ

  • Kiểm tra xem tôi đã gọi lớp truy cập dữ liệu với tham số chính xác đã được truyền vào.
  • Kiểm tra xem nó chỉ được gọi một lần.
  • Kiểm tra xem tôi trả lại chính xác những gì đã được cung cấp cho tôi bởi lớp truy cập dữ liệu. Nếu không, tôi cũng có thể trả về null.

Hiện tại không có logic ở đó, nhưng nó sẽ không luôn luôn như vậy.

Tuy nhiên, nếu bạn tự tin rằng sẽ không có logic trong phương pháp này và nó có khả năng giữ nguyên, hơn là tôi sẽ xem xét việc gọi lớp truy cập dữ liệu trực tiếp từ người tiêu dùng. Tôi sẽ làm điều này chỉ khi phần còn lại của đội ở trên cùng một trang. Bạn không muốn gửi một thông điệp sai đến nhóm bằng cách nói "Này các bạn, thật tốt nếu bỏ qua lớp miền, chỉ cần gọi trực tiếp lớp truy cập dữ liệu".

Tôi cũng sẽ tập trung vào việc thử nghiệm các thành phần khác nếu có một thử nghiệm tích hợp cho phương pháp này. Tôi vẫn chưa thấy một công ty với các bài kiểm tra tích hợp vững chắc.

Đã nói tất cả những điều này - tôi sẽ không mù quáng kiểm tra mọi thứ. Tôi sẽ thiết lập các điểm nóng (các thành phần có độ phức tạp cao và nguy cơ phá vỡ cao). Sau đó tôi sẽ tập trung vào các thành phần này. Không có lý do nào để có một cơ sở mã trong đó 90% cơ sở mã hóa khá đơn giản và nó được bao phủ bởi các thử nghiệm đơn vị, khi 10% còn lại đại diện cho logic cốt lõi của hệ thống và chúng không được bao phủ bởi các thử nghiệm đơn vị do độ phức tạp của chúng.

Cuối cùng, lợi ích của việc thử nghiệm phương pháp này là gì? Các tác động nếu điều này không làm việc là gì? Họ có thảm khốc không? Đừng phấn đấu để đạt được bảo hiểm mã cao. Mã bảo hiểm phải là một sản phẩm của bộ kiểm tra đơn vị tốt. Ví dụ, bạn có thể viết một bài kiểm tra sẽ đi trên cây và cung cấp cho bạn phạm vi bảo hiểm 100% của phương pháp này hoặc bạn có thể viết ba bài kiểm tra đơn vị cũng sẽ cung cấp cho bạn phạm vi bảo hiểm 100%. Sự khác biệt là bằng cách viết ba bài kiểm tra, bạn kiểm tra các trường hợp cạnh, trái ngược với việc chỉ đi trên cây.


Tại sao bạn sẽ kiểm tra rằng DAL của bạn chỉ được gọi một lần?
Marjan Venema

9

Đây là cách tốt để suy nghĩ về chất lượng phần mềm của bạn:

  1. kiểm tra loại là xử lý một phần của vấn đề.
  2. kiểm tra sẽ xử lý phần còn lại

Đối với các chức năng nồi hơi và tầm thường, bạn có thể dựa vào kiểm tra loại thực hiện công việc của mình và đối với phần còn lại, bạn cần các trường hợp kiểm tra.


Tất nhiên, kiểm tra loại chỉ hoạt động nếu bạn đang sử dụng các loại cụ thể trong mã của mình và bạn đang làm việc với ngôn ngữ được biên dịch hoặc bạn đảm bảo rằng kiểm tra phân tích tĩnh được chạy thường xuyên, ví dụ như một phần của CI.
bdsl

6

Theo tôi độ phức tạp chu kỳ là một tham số. Nếu một phương thức không đủ phức tạp (như getters và setters). Không có thử nghiệm đơn vị là cần thiết. Mức độ phức tạp theo chu kỳ của McCabe phải lớn hơn 1. Một từ khác nên có tối thiểu 1 câu lệnh chặn.


Hãy nhớ rằng một số getters hoặc setters có tác dụng phụ (mặc dù nó không được khuyến khích và được coi là thực hành xấu trong hầu hết các trường hợp), vì vậy thay đổi trong mã nguồn của bạn cũng có thể ảnh hưởng đến nó.
Andrzej Bobak

3

CÓ TUYỆT VỜI với TDD (và với một vài ngoại lệ)

Tranh cãi không sao, nhưng tôi cho rằng bất cứ ai trả lời 'không' cho câu hỏi này đều thiếu một khái niệm cơ bản về TDD.

Đối với tôi, câu trả lời là có, nếu bạn theo TDD. Nếu bạn không thì không có câu trả lời hợp lý.

DDD trong TDD

TDD thường được trích dẫn là có lợi ích chính.

  • Phòng thủ
    • Đảm bảo mã có thể thay đổi nhưng không phải là hành vi của nó .
    • Điều này cho phép thực hành tái cấu trúc rất quan trọng .
    • Bạn có đạt được TDD này hay không.
  • Thiết kế
    • Bạn chỉ định những gì nên làm, làm thế nào nó nên hành xử trước khi thực hiện nó.
    • Điều này thường có nghĩa là quyết định thực hiện nhiều thông tin hơn .
  • Tài liệu
    • Bộ thử nghiệm phải đóng vai trò là tài liệu đặc tả (yêu cầu).
    • Sử dụng các thử nghiệm cho mục đích như vậy có nghĩa là tài liệu và việc thực hiện luôn ở trạng thái nhất quán - thay đổi cái này có nghĩa là thay đổi cái khác. So sánh với các yêu cầu giữ và thiết kế trên tài liệu từ riêng biệt.

Trách nhiệm riêng biệt với việc thực hiện

Là những lập trình viên, sẽ rất hấp dẫn khi nghĩ về các thuộc tính như một thứ gì đó có ý nghĩa và getters và setter như một loại chi phí nào đó.

Nhưng các thuộc tính là một chi tiết triển khai, trong khi setters và getters là giao diện hợp đồng thực sự làm cho các chương trình hoạt động.

Điều quan trọng hơn nhiều là đánh vần rằng một đối tượng nên:

Cho phép khách hàng của mình thay đổi trạng thái

Cho phép khách hàng truy vấn trạng thái của nó

sau đó làm thế nào trạng thái này thực sự được lưu trữ (trong đó một thuộc tính là phổ biến nhất, nhưng không phải là cách duy nhất).

Một bài kiểm tra như

(The Painter class) should store the provided colour

rất quan trọng đối với phần tài liệu của TDD.

Thực tế là việc thực hiện cuối cùng là tầm thường (thuộc tính) và không mang lại lợi ích phòng thủ nên bạn không biết khi viết bài kiểm tra.

Thiếu kỹ thuật khứ hồi ...

Một trong những vấn đề chính trong thế giới phát triển hệ thống là thiếu kỹ thuật khứ hồi 1 - quá trình phát triển của một hệ thống bị phân mảnh thành các quy trình phụ rời rạc, các tạo phẩm trong đó (tài liệu, mã) thường không nhất quán.

1 Brodie, Michael L. "John Mylopoulos: may hạt giống của mô hình khái niệm." Mô hình hóa khái niệm: Nền tảng và ứng dụng. Springer Berlin Heidelberg, 2009. 1-9.

... và cách TDD giải quyết nó

Đây là phần tài liệu của TDD đảm bảo rằng các thông số kỹ thuật của hệ thống và mã của nó luôn nhất quán.

Thiết kế trước, thực hiện sau

Trong TDD, chúng tôi viết bài kiểm tra chấp nhận thất bại trước, chỉ sau đó viết mã cho phép chúng vượt qua.

Trong BDD cấp cao hơn, chúng tôi viết các kịch bản trước, sau đó làm cho chúng vượt qua.

Tại sao bạn nên loại trừ setters và getter?

Về lý thuyết, hoàn toàn có thể trong TDD cho một người viết bài kiểm tra và một người khác thực hiện mã làm cho nó vượt qua.

Vì vậy, hãy tự hỏi:

Người viết bài kiểm tra cho một lớp có đề cập đến getters và setter không.

Vì getters và setters là một giao diện chung cho một lớp, câu trả lời rõ ràng là , hoặc sẽ không có cách nào để thiết lập hoặc truy vấn trạng thái của một đối tượng.

Rõ ràng, nếu bạn viết mã trước, câu trả lời có thể không rõ ràng lắm.

Ngoại lệ

Có một số trường hợp ngoại lệ rõ ràng cho quy tắc này - các chức năng là chi tiết triển khai rõ ràng và rõ ràng không phải là một phần của thiết kế hệ thống.

Chẳng hạn, một phương thức cục bộ 'B ()':

function A() {

    // B() will be called here    

    function B() {
        ...
    }
} 

Hoặc chức năng riêng tư square()ở đây:

class Something {
private:
    square() {...}
public:
    addAndSquare() {...}
    substractAndSquare() {...}
}

Hoặc bất kỳ chức năng nào khác không phải là một phần của publicgiao diện cần đánh vần trong thiết kế của thành phần hệ thống.


1

Khi phải đối mặt với một câu hỏi triết học, hãy quay trở lại với các yêu cầu lái xe.

Mục tiêu của bạn là sản xuất phần mềm hợp lý đáng tin cậy với chi phí cạnh tranh?

Hoặc là để sản xuất phần mềm có độ tin cậy cao nhất có thể gần như bất kể chi phí?

Lên đến một điểm, hai mục tiêu về chất lượng và tốc độ phát triển / căn chỉnh chi phí: bạn dành ít thời gian viết bài kiểm tra hơn là sửa lỗi.

Nhưng ngoài thời điểm đó, họ không. Không khó để nói, một lỗi được báo cáo cho mỗi nhà phát triển mỗi tháng. Giảm một nửa trong hai tháng chỉ giải phóng một ngân sách có thể là một hoặc hai ngày, và việc kiểm tra thêm đó có thể sẽ không làm giảm một nửa tỷ lệ khiếm khuyết của bạn. Vì vậy, nó không còn là một chiến thắng / thắng đơn giản; bạn phải chứng minh nó dựa trên chi phí khiếm khuyết cho khách hàng.

Chi phí này sẽ khác nhau (và, nếu bạn muốn trở nên xấu xa, thì khả năng của họ sẽ thực thi những chi phí đó lại cho bạn, cho dù thông qua thị trường hay một vụ kiện). Bạn không muốn trở nên xấu xa, vì vậy bạn tính lại những chi phí đó một cách đầy đủ; đôi khi một số thử nghiệm trên toàn cầu vẫn khiến thế giới trở nên nghèo nàn hơn bởi sự tồn tại của chúng.

Nói tóm lại, nếu bạn cố gắng áp dụng một cách mù quáng các tiêu chuẩn tương tự vào một trang web của kênh như phần mềm máy bay chở khách, bạn sẽ bị loại khỏi công việc hoặc ở tù.


0

Câu trả lời của bạn về điều này phụ thuộc vào triết lý của bạn (tin rằng đó là Chicago vs London? Tôi chắc chắn sẽ có người tìm kiếm nó). Ban bồi thẩm vẫn không đề cập đến vấn đề này theo cách tiếp cận hiệu quả nhất về thời gian (bởi vì, sau tất cả, đó là động lực lớn nhất của việc này - dành ít thời gian hơn cho việc sửa chữa).

Một số phương pháp cho biết chỉ kiểm tra giao diện công cộng, một số khác cho biết kiểm tra thứ tự của từng lệnh gọi trong mỗi chức năng. Rất nhiều cuộc chiến thánh đã được chiến đấu. Lời khuyên của tôi là hãy thử cả hai cách tiếp cận. Chọn một đơn vị mã và thực hiện như X, và một đơn vị khác như Y. Sau một vài tháng thử nghiệm và tích hợp, hãy quay lại và xem cái nào phù hợp với nhu cầu của bạn hơn.


0

Đó là một câu hỏi khó.

Nói đúng ra tôi sẽ nói rằng nó không cần thiết. Bạn nên viết các bài kiểm tra cấp độ hệ thống và đơn vị theo phong cách BDD để đảm bảo các yêu cầu nghiệp vụ hoạt động như dự định trong các kịch bản tích cực và tiêu cực.

Điều đó nói rằng nếu phương thức của bạn không nằm trong các trường hợp thử nghiệm này thì bạn phải đặt câu hỏi tại sao nó tồn tại ở nơi đầu tiên và nếu cần, hoặc nếu có các yêu cầu ẩn trong mã không được phản ánh trong tài liệu hoặc câu chuyện người dùng của bạn nên được mã hóa trong trường hợp thử nghiệm kiểu BDD.

Cá nhân tôi muốn giữ mức độ bao phủ theo dòng ở khoảng 85-95% và đăng ký cổng vào tuyến chính để đảm bảo phạm vi kiểm tra đơn vị hiện có trên mỗi dòng đạt mức này cho tất cả các tệp mã và không có tệp nào bị phát hiện.

Giả sử các thực tiễn kiểm tra tốt nhất đang được tuân theo, điều này mang lại nhiều phạm vi bảo hiểm mà không buộc các nhà phát triển phải lãng phí thời gian để cố gắng tìm ra cách để có được bảo hiểm bổ sung đối với mã khó thực hiện hoặc mã tầm thường chỉ vì mục đích bảo hiểm.


-1

Vấn đề chính là câu hỏi, bạn không cần phải kiểm tra tất cả "methdos" hoặc tất cả các "lớp" bạn cần để kiểm tra tất cả các tính năng của hệ thống của bạn.

Tư duy chính của nó về các tính năng / hành vi thay vì suy nghĩ về các phương pháp và các lớp. Tất nhiên, một phương pháp ở đây để cung cấp hỗ trợ cho một hoặc nhiều tính năng, cuối cùng tất cả mã của bạn đã được thử nghiệm, ít nhất là tất cả các mã quan trọng trong cơ sở mã của bạn.

Trong kịch bản của bạn, có lẽ lớp "trình quản lý" này không cần thiết hoặc không cần thiết (như tất cả các lớp có tên chứa từ "manager") hoặc có thể không, nhưng có vẻ như là một chi tiết triển khai, có lẽ lớp này không xứng đáng là một đơn vị kiểm tra vì lớp này không có logic kinh doanh liên quan. Có lẽ bạn cần lớp này để một số tính năng hoạt động, bài kiểm tra cho tính năng này bao gồm lớp này, bằng cách này bạn có thể cấu trúc lại lớp này và kiểm tra xác minh rằng điều quan trọng, tính năng của bạn, vẫn hoạt động sau khi cấu trúc lại.

Suy nghĩ về các tính năng / hành vi không có trong các lớp phương thức, tôi không thể lặp lại điều này đủ lần.


-4

Điều này làm tôi suy nghĩ, mặc dù. Chúng ta có nên phấn đấu cho% bảo hiểm thử nghiệm cao nhất?

Có, lý tưởng 100%, nhưng một số thứ không thể kiểm chứng được.

getters và setters (trừ khi họ thực sự có một số logic trong đó)

Getters / Setters là ngu ngốc - chỉ không sử dụng chúng. Thay vào đó, đặt biến thành viên của bạn vào phần công khai.

mã "nồi hơi"

Lấy mã phổ biến ra, và kiểm tra đơn vị nó. Điều đó nên đơn giản như vậy.

Có bất kỳ lý do hợp lý / không "dễ cháy" nào về lý do tại sao người ta nên kiểm tra từng dòng mã (hoặc nhiều nhất có thể) không?

Nếu không làm như vậy, bạn có thể bỏ lỡ một số lỗi rất rõ ràng. Các bài kiểm tra đơn vị giống như một mạng lưới an toàn để bắt một số loại lỗi nhất định và bạn nên sử dụng nó càng nhiều càng tốt.

Và điều cuối cùng: Tôi đang tham gia một dự án nơi mọi người không muốn lãng phí thời gian viết bài kiểm tra đơn vị cho một số "mã đơn giản", nhưng sau đó họ quyết định không viết gì cả. Cuối cùng, các phần của mã đã biến thành một quả bóng lớn .


Vâng, hãy nói thẳng một điều: Tôi không có nghĩa là tôi không sử dụng các bài kiểm tra TDD / write. Hoàn toàn ngược lại. Tôi biết rằng các bài kiểm tra có thể tìm thấy lỗi mà tôi không nghĩ tới, nhưng có gì để kiểm tra ở đây? Tôi chỉ đơn giản nghĩ rằng phương pháp đó là một trong những phương pháp "không thể kiểm tra được đơn vị". Như Péter Török đã nói (trích dẫn Kent Beck), bạn nên thử nghiệm những thứ có thể phá vỡ. Điều gì có thể phá vỡ ở đây? Không thực sự nhiều (chỉ có một phái đoàn đơn giản trong phương pháp này). Tôi CÓ THỂ viết một bài kiểm tra đơn vị nhưng đơn giản là nó sẽ có một bản DAO và một bản khẳng định, không có nhiều bài kiểm tra. Đối với getters / setters một số khung yêu cầu chúng.
Zenzen

1
Ngoài ra, vì tôi đã không nhận thấy điều đó "Lấy mã chung và kiểm tra đơn vị. Điều đó sẽ đơn giản như vậy." Ý bạn là như thế nào? Đây là một lớp dịch vụ (trong một lớp dịch vụ giữa GUI và DAO), nó là chung cho toàn bộ ứng dụng. Không thể thực sự làm cho nó chung chung hơn (vì nó chấp nhận một số tham số và gọi một phương thức nhất định trong DAO). Lý do duy nhất là nó phải tuân thủ kiến ​​trúc phân lớp của ứng dụng để GUI sẽ không gọi trực tiếp DAO.
Zenzen

20
-1 cho "Getters / Setters là ngu ngốc - chỉ không sử dụng chúng. Thay vào đó, hãy đặt biến thành viên của bạn vào phần công khai." - Rất sai. Điều này đã được thảo luận nhiều lần về SO . Sử dụng các lĩnh vực công cộng ở mọi nơi thực sự tồi tệ hơn thậm chí sử dụng getters và setters ở mọi nơi.
Péter Török
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.