Bạn có thể làm gì về chất lượng của các bài kiểm tra đơn vị và tích hợp hiện có trong khi là người mới trong một nhóm?


21

Một chủ đề định kỳ mà tôi bắt gặp trong sự nghiệp của mình là nhà phát triển mới đến một nhóm và nhanh chóng có sự ngờ vực vốn có của các bộ thử nghiệm tích hợp và đơn vị hiện có.

Trong cuộc phỏng vấn, bạn được ban quản lý nói rằng họ "rất ủng hộ việc kiểm tra đơn vị" và họ công khai khuyến khích điều đó. Họ làm, nhưng tất cả mọi thứ về các bài kiểm tra chỉ là sai. Giống như thực tế là họ đang yêu cầu bảo hiểm 100% khi có phạm vi kiểm tra tích hợp 100% nhưng phạm vi kiểm tra đơn vị lặp lại dưới 10%. Một số vấn đề khác tôi đã tìm thấy:

  1. Không có chỉ dẫn rõ ràng giữa thử nghiệm đơn vị và thử nghiệm tích hợp là gì. Các bài kiểm tra đơn vị và tích hợp được trộn lẫn với nhau trong cùng một lớp.

  2. Kiểm tra tích hợp đã không khai báo phụ thuộc rõ ràng vào dữ liệu động rất cụ thể trên cơ sở dữ liệu của một môi trường cụ thể.

  3. Các thử nghiệm tích hợp phi giao dịch, về cơ bản là các thử nghiệm có thể hoặc không cần phải tự dọn dẹp, đôi khi yêu cầu "chà" cơ sở dữ liệu thủ công để làm cho thử nghiệm có thể lặp lại.

  4. Không chế nhạo bất cứ điều gì, và mã ứng dụng đòi hỏi một cuộc đại tu lớn chỉ để chế giễu là có thể. Nói cách khác, thiết kế mà không cần thử nghiệm trong tâm trí.

  5. Không có quy ước đặt tên rõ ràng để nhanh chóng xem xét tên thử nghiệm và xác định đại khái những thử nghiệm nào đang được thực hiện.

Đây là tất cả để không nói rằng TẤT CẢ các bài kiểm tra là vô ích hoặc xấu, một phần lớn trong số chúng là khá tốt và đáng để giữ, nhưng đôi khi nó cảm thấy giống như vàng. Tôi cố tình tránh chạy thử nghiệm chỉ vì tôi sợ làm hỏng cơ sở dữ liệu cho các trường hợp thử nghiệm hộp đen của mình.

Điều này về cơ bản đã cho tôi một sự ngờ vực vốn có của các bài kiểm tra đơn vị và tích hợp mà tôi chưa từng viết hoặc xem xét cá nhân theo một cách nào đó. Ở một mức độ nào đó nếu bạn không có niềm tin vào chất lượng của bộ thử nghiệm thì nó thực sự không mang lại giá trị gì cho nhóm hoặc dự án.

Bạn làm gì khi thấy mình trong tình huống này? Bạn cảm thấy kế hoạch tấn công tốt nhất là gì để giải quyết chuyện như thế này?

Tất cả các bài kiểm tra có nên được cấu trúc lại trong một nỗ lực hoành tráng trải dài trên các bản phát hành không? Bạn có nên từ bỏ ý tưởng rằng dự án kế thừa này có thể có một ngày bảo hiểm thử nghiệm đơn vị vững chắc?


6
Chào mừng đến với thế giới thực, anh bạn.
tdammers

20
Hãy vui vì bạn đã thử nghiệm.
Joel Etherton

3
Tại sao bạn làm việc cho các công ty rõ ràng dưới mức năng lực của bạn?
TrojanName

3
@Brian, tôi đánh giá cao đột quỵ bản ngã, nhưng không có nhiều người nghĩ như tôi thì các công ty này sẽ không bao giờ vượt lên. Đây là lần đầu tiên tôi ở một vị trí quyền lực thực sự, vì tôi đã phát triển một lượng tầm quan trọng chính trị khiêm tốn cho một lần. Tôi có một cơ hội thực sự ở đây để định hướng các nguồn lực để làm cho mọi thứ tốt hơn. Tôi chưa tìm thấy một công ty nào hoàn hảo mà không cần phải làm việc. Nó giống như người chồng hoặc người vợ hoàn hảo, họ không đi cùng, một người đủ tốt sẽ xuất hiện và sau đó bạn thay đổi họ thành những gì bạn muốn họ trở thành;)
maple_shaft

1
Tôi nghĩ rằng chúng tôi có thể làm việc cho cùng một đội. Bây giờ bạn (và tôi) biết làm thế nào để thực sự đặt câu hỏi trong các cuộc phỏng vấn tiếp theo của chúng tôi. (Trên thực tế, môi trường của tôi không có phạm vi kiểm tra tích hợp gần 100% hoặc thậm chí 10% [kiểm tra đơn vị thực sự? Đó là cuộc nói chuyện điên rồ!], Nhưng bạn đã đóng đinh tất cả các điểm khác mà tôi đang xử lý.)
Anthony Pegram

Câu trả lời:


6

Trước hết, như các áp phích khác đã được viết, bạn nên hiểu rõ về kiểm thử đơn vị / tích hợp (không phải theo cách kỹ thuật, ý tôi là lý do tại sao nó nên được hiểu) và được ban quản lý thúc đẩy.

Trước khi bạn bắt đầu làm mọi thứ, bạn nên phơi bày vấn đề với ban quản lý, tại sao nên làm gì đó và rất ngoại giao để họ không nghĩ bạn nghĩ bạn là lập trình viên giỏi nhất thế giới (ngay cả khi bạn là! :-). Có thể họ sẽ nói với bạn rằng ứng dụng sẽ được thay thế bằng một thứ hoàn toàn mới, và nếu vậy, tại sao phải bận tâm. Và có lẽ họ sẽ nhận ra rằng nó sẽ rất hay và tăng tốc giai đoạn thử nghiệm trước mỗi lần phát hành. Và hãy ngoại giao với các đồng đội của bạn , có thể có hàng triệu lý do tại sao nó lại như vậy và không có lý do gì để tìm kiếm một thủ phạm.

Một ý tưởng tốt hơn là cố gắng nói chuyện với họ để họ có thể tham gia nỗ lực, và bạn sẽ có ít cơ hội xuất hiện như một người thông minh hơn, đó sẽ là "chúng ta" hơn là "tôi".

Bây giờ, đặt ưu tiên cho những gì bạn muốn làm. Ưu tiên các nhiệm vụ, luôn biết rằng ưu tiên hàng đầu của bạn sẽ luôn là nhiệm vụ dự án hiện tại của bạn ... Đối với vấn đề kiểm tra của bạn, đây là những gì tôi sẽ làm, trong ba giai đoạn:

  1. Làm thế nào để tạo sự khác biệt giữa các bài kiểm tra đơn vị và tích hợp? Các giải pháp sau đây có thể áp dụng và không độc quyền:

    • Tái cấu trúc tên của các phương thức trường hợp kiểm thử (không phải các lớp vì hành vi đúng là để trường hợp kiểm thử chia sẻ cùng tên với lớp được kiểm tra)
    • Tạo hai chú thích, một chú thích có tên "UnitTest", "IntegrationTest" khác. Các chú thích này có thể được sử dụng trên các lớp và trên các phương thức. Nếu toàn bộ một lớp bao gồm các bài kiểm tra đơn vị hoặc tích hợp, bạn có thể đánh dấu lớp đó bằng chú thích đúng. Nếu không, bạn có thể đánh dấu từng phương thức bằng chú thích đúng. Ngoài ra, các chú thích này có thể hữu ích để tự động tiêm đồ đạc trước khi khởi chạy các thử nghiệm (giai đoạn 3)
  2. Đối với mỗi thử nghiệm tích hợp, hãy liệt kê "tập dữ liệu" nào được dự kiến ​​sẽ có trong cơ sở dữ liệu ở đầu mỗi thử nghiệm và những gì cần được loại bỏ ở cuối của nó (ví dụ: bảng X, cần một bản ghi với "id" được đặt thành "1" và "tên" được đặt thành "foo", v.v.). Lưu ý rằng những gì bạn loại bỏ có thể lớn hơn / nhỏ hơn những gì bạn có lúc đầu vì chính mã có thể lần lượt thêm / xóa các đối tượng khỏi lớp lưu giữ. Rất có thể bạn sẽ nhanh chóng nhận thấy rằng một vài trong số các trường hợp thử nghiệm này cần cùng một tập dữ liệu hoặc một phần của cùng một tập dữ liệu.

  3. Hai giai đoạn đầu có thể được thực hiện tương đối nhanh chóng ... so với phần còn lại. Bây giờ bạn đã có tập dữ liệu của mình, bạn sử dụng đồ đạc tạo dữ liệu cho từng trường hợp kiểm tra cần nó. Nhưng điều đó sẽ tốn một chút thời gian ... Vì vậy, bạn có thể làm một việc, xem bạn tốn bao nhiêu thời gian và ước tính bạn cần thêm bao nhiêu thời gian để làm mọi thứ. Ngoài ra, bạn có thể sử dụng bài kiểm tra đó để chứng minh cho đồng nghiệp của mình biết bạn đã làm gì và tại sao cuộc sống lại dễ dàng hơn nhiều khi bạn không cần phải có cơ sở dữ liệu trong một trạng thái cụ thể để thực hiện các bài kiểm tra.

Bạn có thể lưu ý rằng giai đoạn 1, 2 và 3 có thể được thực hiện trên một lớp kiểm tra duy nhất, nếu bạn muốn nhanh chóng chỉ cho đồng nghiệp / quản lý cách thực hiện. Điều này cũng sẽ hữu ích, như Péter Török đã viết, để ngay lập tức hiển thị "cách tốt" cho đồng đội của bạn để họ ngừng sản xuất mã xấu. Tuy nhiên tôi nghĩ rằng phần còn lại của giai đoạn 2, xác định toàn bộ tập dữ liệu thử nghiệm, được thực hiện tốt nhất trong một bước lớn.

Đối với API / công nghệ đằng sau tất cả, bạn dường như biết chủ đề này.

Hy vọng rằng đã giúp một chút.

Lưu ý: đối với đề xuất của tôi, tôi giả sử bạn viết mã bằng Java / C # nơi tôi biết chú thích và AOP là có thể. Tôi chắc chắn điều này cũng có thể có trong các ngôn ngữ khác, nhưng tôi sẽ không viết về những điều tôi không biết.


1
Cảm ơn ... Tôi đã xem xét sử dụng chú thích làm nhãn để xác định thử nghiệm tích hợp là gì và thử nghiệm đơn vị là gì ... Bạn có biết có thể định cấu hình máy chủ CI như CruiseControl để loại trừ các thử nghiệm nhất định dựa trên chú thích không? Có lẽ đó là một câu hỏi riêng biệt.
maple_shaft

Tôi xin lỗi tôi không biết sử dụng CruiseControl vì vậy tôi không biết về điều đó. Tôi đã tìm kiếm trong cấu hình plugin Surefire của Maven chỉ vì tò mò và dường như không thể, tuy nhiên hoàn toàn có thể bỏ qua các bài kiểm tra dựa trên tên của khóa học.
Jalayn

14

Bạn sẽ không thể sửa tất cả các bài kiểm tra cùng nhau. Tôi nghĩ bạn nên tập trung vào việc cải thiện từ so với đại tu . Cả quản lý không phải nhà phát triển sẽ đồng ý về việc đại tu nhưng nếu bạn cho thấy rằng có một cách để cải thiện mọi thứ mà không ảnh hưởng tiêu cực đến dự án, họ sẽ có nhiều khả năng lắng nghe hơn.

Trước tiên, bạn không thể 'sửa chữa' hoặc cấu trúc lại mã hiện tại trừ khi bạn có phạm vi kiểm tra chất lượng, vì vậy tôi sẽ tập trung vào sửa lỗi cơ sở hạ tầng kiểm tra của bạn trước.

Lập danh sách những thứ cần cải thiện và cố gắng ưu tiên chúng. Tôi nghĩ rằng khả năng chạy thử nghiệm độc lập và đơn lẻ (để chúng không ảnh hưởng lẫn nhau) và việc tách các thử nghiệm đơn vị và tích hợp là một trong những điều đầu tiên để thực hiện. Bạn cần làm cho nó dễ dàng cho bạn và những người khác để làm điều đúng đắn.

Theo như mã ứng dụng có liên quan ... Bạn sẽ không thể thực hiện việc đại tu toàn bộ kiến ​​trúc ứng dụng chỉ để nó có thể được thử nghiệm đơn vị tốt hơn. Thay vào đó, khi bạn đặt mã mới, hãy thử áp dụng các nguyên tắc giúp kiểm tra đơn vị dễ dàng hơn (như tiêm phụ thuộc). Bạn có thể nghĩ rằng điều này không đủ lớn để thay đổi, nhưng thật đáng ngạc nhiên khi các nhà phát triển nhanh chóng nắm bắt nếu họ thấy được lợi ích. Chỉ cần có một người bắt đầu thay đổi để tốt hơn.

Nói chuyện với nhóm của bạn và khiến họ mua. Một trong những điều quan trọng nhất bạn có thể làm là tuân theo ' Quy tắc hướng đạo nam ' và thực hiện những cải tiến nhỏ để rời khỏi một lớp học hoặc kiểm tra trong một hình dạng tốt hơn sau đó bạn tìm thấy nó . Nếu toàn đội áp dụng quy tắc này, mọi thứ sẽ tốt hơn nhanh hơn rất nhiều.

Sau một thời gian, bạn sẽ có rất nhiều mã tuân theo các nguyên tắc và lĩnh vực tốt của ứng dụng có hình dạng xấu. Tại thời điểm này, bạn có một đường cơ sở về những gì tốt và nhóm có thể quyết định xem có ích gì khi thực hiện một phép tái cấu trúc lớn hơn cho các công cụ cũ hơn hay nó chỉ có thể tồn tại như hiện tại.


8
+1 và tôi sẽ thêm "bắt đầu bằng ví dụ." Không ai đánh giá cao anh chàng bước vào và nói "bạn đang làm sai", nhưng nếu bạn thể hiện sự cải thiện thì nhiều khả năng họ sẽ làm theo.
StevenV

2
+1 cho Quy tắc Hướng đạo nam , việc sử dụng và bán dễ dàng hơn nhiều so với bất kỳ phương pháp đại tu nào.
Matthieu M.

10

Tôi phải thừa nhận rằng tôi sẽ coi đó là một món quà hiếm hoi khi đến dự án nơi họ đã có một số lượng đáng kể các bài kiểm tra đơn vị / tích hợp - tôi chưa bao giờ gặp may mắn đó trong đời. Ngay cả khi không phải tất cả trong số họ đang làm việc như họ nên, đã có rất nhiều nỗ lực được đưa vào, và ngay cả khi nhóm và quản lý không luôn tuân theo các thực tiễn tốt nhất, họ vẫn cam kết với nguyên nhân, vì vậy bạn không cần dành thời gian của bạn để tranh luận về lý do tại sao các bài kiểm tra đơn vị đáng để viết.

Tuy nhiên, các bài kiểm tra như bạn mô tả chúng thực sự có thể có một số cải tiến. Nhưng bạn cần cẩn thận với giọng điệu của mình khi thảo luận về các vấn đề với đồng đội . Nếu bạn bắt đầu bằng cách tuyên bố "mọi thứ về bản thân các bài kiểm tra chỉ là sai" , bạn có thể sẽ nhanh chóng xa lánh các thành viên còn lại trong nhóm. Thay vào đó, bạn nên tập trung vào cách cải thiện tình trạng hiện tại, điều mà - tôi phải nhắc lại - vẫn tốt hơn đáng kể so với mức trung bình theo kinh nghiệm của tôi cho đến nay.

IMO mục tiêu đầu tiên của bạn là ngăn chặn nhóm tạo ra nhiều bài kiểm tra tồi hơn . Vì vậy, hãy bắt đầu bằng cách chứng minh lợi ích của từng cải tiến cụ thể cho đồng đội của bạn. Nếu họ thấy sự hữu ích của một kỹ thuật nhất định - có thể là cắt giảm các phụ thuộc bên ngoài, khôi phục trạng thái ban đầu sau mỗi thử nghiệm hoặc tách các thử nghiệm đơn vị và tích hợp - họ sẽ bắt đầu áp dụng chúng. Điều này tự nó sẽ chậm nhưng chắc chắn sẽ cải thiện chất lượng tổng thể của cơ sở thử nghiệm trong thời gian dài (nếu bây giờ bạn có 1000 trường hợp thử nghiệm xấu và nhóm tạo ra 1000 thử nghiệm tốt vào năm tới, bạn sẽ giảm tỷ lệ các thử nghiệm xấu từ 100% đến 50%). Khi điều đó được bảo mật, bạn có thể quyết định tái cấu trúc các bài kiểm tra hiện có trong từng trường hợp. Một lần nữa, những cải tiến nhỏ sẽ thêm vào những thay đổi lớn theo thời gian.

Như một lưu ý phụ, từ giọng điệu của bài đăng của bạn, tôi cảm thấy bạn có thể ở một nơi mà tôi đã từng quá: không tin tưởng vào công việc được thực hiện bởi người khác, không thể giao nhiệm vụ cho bất cứ ai vì sợ công việc của họ không theo ý bạn tiêu chuẩn chất lượng riêng. Theo kinh nghiệm của tôi, đây không phải là một nơi tốt, bởi vì về lâu dài, nó có thể dễ dàng dẫn đến xung đột cá nhân và kiệt sức. Bạn không thể làm mọi thứ một mình, bạn phải làm việc cùng với các thành viên còn lại trong nhóm. Bạn chỉ có thể thành công cùng nhau.


6

Làm việc hướng tới sự độc lập thử nghiệm. Nếu kiểm tra X sửa đổi cơ sở dữ liệu kiểm tra theo cách kiểm tra Y thất bại, thì thay đổi kiểm tra Y. Trong kịch bản nhỏ này, điều cần tập trung vào không phải là X đã làm xáo trộn cơ sở dữ liệu, mà là Y có các phụ thuộc không phù hợp. Loại bỏ các phụ thuộc đó (bằng cách loại bỏ cơ sở dữ liệu, bằng cách cấu trúc lại bài kiểm tra hoặc bằng cách khởi tạo cơ sở dữ liệu đến trạng thái Y sẽ vượt qua) và bây giờ bạn có thêm một bài kiểm tra làm việc độc lập. Đó là sự tiến bộ (có thể nói là "sửa lỗi" X để không làm xáo trộn cơ sở dữ liệu sẽ không xảy ra).

Hãy kiên nhẫn và tôn trọng, hết sức có thể, trong số những người bạn đang làm việc cùng, bất chấp mớ hỗn độn họ đã tạo ra. Họ đang cố gắng làm điều đúng đắn, trong tất cả khả năng; ghi nhớ điều đó và giúp họ làm điều đó


2
Tôi nên đã đề cập rằng không có ai trong số những người tạo ra mớ hỗn độn ban đầu ở đây nữa. Họ không cảm thấy muốn đối phó với khoản nợ kỹ thuật mà họ tạo ra và tiếp tục.
maple_shaft

4
@maple_shaft: Thật tốt khi họ biến mất ... bạn có thể cải thiện mọi thứ mà không có ai mất mặt.
kevin cline

2

Điểm hay của việc làm quen với đội là bạn có cách tiếp cận "mới mẻ" với mọi thứ. Phần xấu có thể là người khác có thể khó tin bạn.

Đừng tạo ra một danh sách những việc cần làm. Nhưng chọn MỘT điều có vẻ khẩn cấp và những người khác có khả năng đáp ứng và đề xuất giải pháp. Nếu nó hoạt động, tuyệt vời, sau đó đề xuất một giải pháp khác cho một vấn đề khác, về sức mạnh của thành công đầu tiên của bạn.

Nhưng hãy chậm lại, từng người một và hy vọng rằng ý tưởng của bạn sẽ "bắt kịp" trong nhóm mới.


2

đưa ra ví dụ bạn muốn xem, nhưng đánh giá cao quan điểm của một nhà phát triển khác trong thử nghiệm: một nhà phát triển có thể kiểm tra thành công, trong khi một nhà phát triển khác có thể kiểm tra các thất bại, một nhà phát triển đã viết lớp trong khi một nhà phát triển khác có thể sử dụng nó lần đầu tiên khi viết thử nghiệm.

các xét nghiệm hiện tại (erm, hầu hết) vẫn có mục đích, mặc dù nó có thể không rõ ràng ngay lập tức. tôi không khuyên bạn nên đại tu và tái cấu trúc tất cả mọi thứ cùng một lúc (nó rất tẻ nhạt và dễ bị lỗi). kiểm tra xấu cuối cùng cần phải được cập nhật, viết lại hoặc đơn giản là chúng có thể trở nên lỗi thời khi phần mềm phát triển.

nếu cách tiếp cận kiểm tra của bạn vượt trội về mặt nào đó, mọi người sẽ học hỏi từ mô hình đó hoặc nhờ bạn giúp đỡ. sẽ có sự cân bằng các nguồn lực, nhưng bạn có thể gia hạn khi cần thiết để hỗ trợ các bài kiểm tra của mình.

cuối cùng, bạn muốn tăng chất lượng của các chương trình thông qua các bài kiểm tra và cải thiện phạm vi bảo hiểm. bạn có thể làm điều này bằng cách nhấn mạnh hơn vào kiểm tra và nêu gương tốt - nhưng hãy đánh giá cao quan điểm của người khác.

khi nhấn mạnh tầm quan trọng, bạn có thể làm cho môi trường hoạt động của các thử nghiệm của mình khác đi - một ví dụ rõ ràng là chạy thử nghiệm song song; nếu nó không được phát hành lại, bạn đã tìm thấy một lỗi trong chương trình hoặc bài kiểm tra của mình (thắng / thắng). một môi trường kiểm tra nghiêm ngặt hơn sẽ buộc các bài kiểm tra xấu phải được sửa chữa và / hoặc viết lại (hy vọng đúng cách trong lần thứ hai). từ từ đưa ra những thay đổi như vậy (không phá vỡ một nửa các bài kiểm tra cùng một lúc - đó là một vấn đề thực sự), buộc họ phải học những gì tạo ra một bài kiểm tra tốt, và cuối cùng là một chương trình tốt. sau đó khi bạn và những người khác tham gia và sửa đổi / sửa chữa / mở rộng các bài kiểm tra, hãy áp dụng những gì bạn đã học - nó gia tăng và bạn hiểu rõ hơn về bối cảnh / chương trình tại thời điểm đó.


2

Sửa chúng theo thời gian

Tôi đã ở trong tình trạng tương tự. Tôi chỉ dành một giờ mỗi sáng để trải qua các bài kiểm tra và sửa chúng cho đến khi tất cả đều được sửa. Đó là một codebase cỡ trung bình và tôi nghĩ rằng tôi đã hoàn thành trong 1,5 tháng. Tôi cũng đã tự tin hơn nhiều trong các bài kiểm tra của chúng tôi.

Cá nhân tôi không quan tâm nếu một bài kiểm tra là bài kiểm tra đơn vị hoặc bài kiểm tra tích hợp miễn là bài kiểm tra tốt. Bằng cách kiểm tra tốt, tôi có nghĩa là nó:

  • làm sạch sau khi chính nó
  • có thể lặp lại
  • giảm thiểu các tương tác môi trường
  • là phù hợp

Trên đường đi, tôi truyền giáo xây dựng thử nghiệm tốt hơn (có nghĩa là tôi đã làm phiền mọi người rất nhiều).

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.