Đánh giá xem có nên viết thử nghiệm đơn vị hoặc thử nghiệm tích hợp trước tiên trên các dự án bầu trời xanh / nguyên mẫu


10

Một cái gì đó tôi nhận thấy gần đây là khi tôi đang thực hiện các loại dự án sau:

  • Khi bắt đầu một dự án
  • Làm việc trên MVP / nguyên mẫu
  • Thêm các tính năng không hoàn toàn được xác định
  • Làm việc trên một dự án quy mô nhỏ hơn

Để tham khảo, tôi hiện đang làm việc với một dự án Python hiện có ~ 1k dòng mã, bao gồm một số nhận xét và tất cả khoảng trắng.

Tôi thấy việc đầu tiên viết các bài kiểm tra tích hợp, làm việc trên mã rất dễ dàng và sau đó một khi API được làm cứng thực sự hoạt động trên việc thêm các bài kiểm tra đơn vị. Các loại thử nghiệm mà tôi có thể chạy trên mainchức năng của mình , có thể nói, và "kết thúc" hơn bất kỳ thứ gì khác.

Điều này là do các thử nghiệm đơn vị thực sự gây phiền nhiễu khi API thay đổi khá nhanh, thường là trường hợp khi làm việc trên một dự án phù hợp với bất kỳ hoặc hầu hết các tiêu chí ở trên.

Cách tiếp cận này có phải là một cách tiếp cận tốt và những tiêu chí nào cần được xem xét khi đưa ra quyết định nên bắt đầu với các bài kiểm tra đơn vị hoặc tích hợp trước cho các loại dự án này? Tôi có thiếu giá trị của đơn vị thử nghiệm các loại dự án này trước khi API được củng cố vững chắc hơn không?


6
Làm bất cứ điều gì tốt nhất cho bạn. Đừng nghe những người nói rằng bạn phải làm việc theo một cách nhất định để có hiệu quả: bạn biết khi nào bạn hiệu quả và khi nào bạn không làm việc. Cho dù bạn viết bài kiểm tra tích hợp trước hay bài kiểm tra đơn vị trước, không thực sự quan trọng. Đối với một số dự án một cách có thể dễ dàng hơn, và đối với những người khác, cách khác. Những gì bạn đang mô tả có thể là sự khác biệt giữa thiết kế từ trên xuống và từ dưới lên. Cả hai đều hữu ích, nhưng từ trên xuống thường tạo ra các thiết kế tốt hơn.
Frank Hileman

@FrankHileman thực sự, đó là cách tiếp cận của tôi. Nhưng vì tôi tò mò nên tôi muốn chắc chắn rằng mình đang thực hiện đúng phương pháp trong trường hợp tôi thiếu thứ gì đó.
enderland

Tập trung vào các thông số kỹ thuật đầu tiên: các phần không mã. Các bất biến của hệ thống là gì? Khi làm điều này, bạn có thể thấy bạn cần phải tìm ra cấp độ thấp trước hoặc cấp độ cao trước. Nó phụ thuộc vào nơi các thuật toán quan trọng nhất hoặc rủi ro được đặt. Hãy cố gắng đưa những người ra khỏi đường đầu tiên. Đó là quản lý rủi ro cơ bản.
Frank Hileman

1
Trong trường hợp làm việc trên nguyên mẫu, nó không ổn khi viết bài kiểm tra. Mục tiêu của nguyên mẫu là kiểm tra ý tưởng làm việc. Việc thực hiện nguyên mẫu sẽ giúp nhận ra thiết kế ứng dụng dự kiến.
Fabio

Nó được gọi là phát triển bên ngoài. Bạn có thể muốn xem cuốn sách sau đây, chính xác là: amazon.com/dp/0321503627
Eternal21

Câu trả lời:


7

Tôi có thiếu giá trị của đơn vị thử nghiệm các loại dự án này trước khi API được củng cố vững chắc hơn không?

Không. Bạn đang làm tốt.

Hai mục tiêu lớn của TDD là:

  • Xác định giao diện bằng cách sử dụng thực tế, thay vì thực hiện nội bộ 1
  • Tối đa hóa phạm vi kiểm tra

Kiểm tra phạm vi có thể được tối đa hóa khá tốt trong cả hai cách bạn đi. Đó là, bất kể bạn thử nghiệm đầu tiên nhỏ , đơn vị bị cô lập hoặc lớn , các đơn vị "tích hợp", bạn có tùy chọn để viết bài kiểm tra của bạn trước khi triển khai của bạn.

Những gì bạn đạt được khi viết các bài kiểm tra cấp độ cao hơn ("tích hợp"), như bạn đang làm, là sự đảm bảo rằng các giao diện và tương tác cấp cao hơn của bạn cũng được xác định chủ yếu theo cách sử dụng của chúng, thay vì theo cách triển khai bên trong của chúng.

Hiệu quả tương tự có thể đạt được phần lớn với một số "kiến trúc" và sơ đồ hóa tốt. Nhưng, những bài kiểm tra cấp cao đó thường có thể tiết lộ những điều bạn đã bỏ lỡ trong sơ đồ của mình - hoặc rằng bạn đã sai trong công việc "kiến trúc" của mình.


Nếu bạn không thực sự làm TDD (hoặc bất cứ điều gì tương tự), thứ tự bạn viết các bài kiểm tra không quan trọng lắm. Các giao diện đã tồn tại vào thời điểm bạn kiểm tra, do đó, rất ít khả năng các bài kiểm tra của bạn sẽ thay đổi bất cứ điều gì - chúng sẽ chỉ phục vụ để bảo vệ chống lại các thay đổi vi phạm cụ thể.

Nhưng, nếu bạn quan tâm đến việc xây dựng triển khai từ trên xuống so với mông, thì gạch đầu tiên vẫn áp dụng ở mức độ lớn. Mã mức cao giúp xác định giao diện cấp thấp. Trong khi đó, nếu các giao diện cấp thấp được viết trước (hoặc nếu không thì đã tồn tại), mã cấp cao nằm trong tầm ngắm của họ ...


1. Điều này cũng áp dụng ngay cả khi bạn không thực hiện TDD đầy đủ. Ngay cả khi bạn chỉ viết 1 hoặc 2 bài kiểm tra trước khi thực hiện, thì 1 hoặc 2 bài kiểm tra đó có thể giúp bạn xác định hoặc tinh chỉnh giao diện của mình trước khi quá muộn!


1

Tôi đã làm việc theo cách bạn đang làm việc. Và tôi sẽ không nói với bạn rằng bạn không thể. Tôi sẽ cảnh báo bạn về một cái gì đó bạn có thể gặp phải.

Khi mọi bài kiểm tra đơn vị chỉ đơn giản là trang bị thêm, thật khó để học cách làm cho chúng linh hoạt. Họ có xu hướng không có gì nhiều hơn các bài kiểm tra hồi quy. Vì bạn chưa bao giờ sử dụng chúng để giúp bạn tái cấu trúc nên việc viết các loại bài kiểm tra thực sự khiến việc tái cấu trúc trở nên khó khăn hơn. Điều này có xu hướng vượt khỏi tầm kiểm soát cho đến khi bạn mất hết niềm tin vào TDD.

Tuy nhiên, bạn đã làm việc trên một cái gì đó. Tôi sẽ không bảo bạn dừng lại. Tôi sẽ nói rằng nó có thể là giá trị nó để bắt đầu một cái gì đó khác mà bạn có thời gian để khám phá và theo chu kỳ tái cấu trúc màu xanh lá cây màu đỏ ngay từ đầu. Hãy chắc chắn rằng bạn thực sự sử dụng các bài kiểm tra để giúp bạn tái cấu trúc. Cho đến khi bạn thành thạo cách làm việc này, hãy sử dụng nó một cách tiết kiệm vào những thứ quan trọng. Đây là một cách rất khác để viết mã và làm quen. Làm một nửa cách sẽ không làm ai tốt cả.

Mà nói

Tôi thấy việc đầu tiên viết các bài kiểm tra tích hợp, làm việc trên mã rất dễ dàng và sau đó một khi API được làm cứng thực sự hoạt động trên việc thêm các bài kiểm tra đơn vị. Các loại thử nghiệm mà tôi có thể chạy trên chức năng chính của mình, có thể nói, và "kết thúc" nhiều hơn bất kỳ thứ gì khác.

Hiểu rằng một bài kiểm tra đơn vị KHÔNG chỉ đơn giản là một bài kiểm tra hoạt động trên một lớp. Miễn là API bạn đang làm việc có thể được kiểm tra mà không cần thực hiện bất kỳ thao tác nào sau đây mà bạn đang thực hiện kiểm tra đơn vị:

  • Nó nói chuyện với cơ sở dữ liệu
  • Nó giao tiếp trên mạng
  • Nó chạm vào hệ thống tập tin
  • Nó không thể chạy cùng lúc với bất kỳ bài kiểm tra đơn vị nào khác của bạn
  • Bạn phải làm những điều đặc biệt cho môi trường của mình (chẳng hạn như chỉnh sửa tập tin cấu hình) để chạy nó.

Michael Feathers: Một bộ quy tắc kiểm tra đơn vị

Vì vậy, nếu thử nghiệm đầu cuối của bạn liên quan đến nhiều hơn một đối tượng thì tốt. Đây là thử nghiệm đơn vị không phải thử nghiệm đối tượng.

Giống như các phương thức riêng tư không cần phải được kiểm tra nữa, sau đó chúng được kiểm tra thông qua thử nghiệm các phương thức công khai sử dụng chúng, các đối tượng không cần phải được phát triển ban đầu theo khai thác thử nghiệm của riêng chúng. Chỉ khi các đối tượng đang được xem xét để sử dụng độc lập với câu chuyện từ đầu đến cuối thì chúng mới thực sự cần được xử lý như chúng có giao diện và hành vi riêng để xác nhận. Nếu bạn cẩn thận về điều này thì đây là khi bạn công khai những đồ vật đó. Bằng cách này, bạn không đưa ra lời hứa nào mà bạn chưa thử nghiệm.

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.