Tại sao Kiểm tra hướng phát triển (TDD) là cách tốt nhất để mã hóa mạnh mẽ.

Đầu tiên, viết bài kiểm tra đơn vị, sau đó viết mã.

Tín dụng hình ảnh: Pexels.com

Cách đây vài năm, khi lần đầu tiên tôi nghe nói về Thử nghiệm phát triển hướng thử nghiệm, tôi đã hoài nghi.

Chính ý tưởng về những bài kiểm tra đơn vị đầu tiên viết, sau đó viết mã ra là rất khó hiểu với tôi.

Tại sao nó sẽ là nó? Viết bài kiểm tra đơn vị của bạn đầu tiên? Ai sẽ làm một điều ngớ ngẩn như vậy?

Nhưng tôi đã trở thành một lập trình viên chuyên nghiệp trong 10 năm và tôi đã thấy mọi thứ đến và đi trong ngành công nghiệp. Tôi biết rõ hơn là gạt bỏ mọi thứ ra khỏi tầm tay, đặc biệt là khi các nhà phát triển quá hăng hái về nó.

Vì vậy, tôi đã hỏi ý kiến ​​một người bạn của tôi, người đã chỉ cho tôi một ví dụ cơ bản.

Ví dụ cơ bản này có lớp LCL_SUM với phương thức SUM. Phương pháp này trách nhiệm của người khác là THÊM các con số. Nó lấy một số làm tham số nhập và sau đó thêm nó vào chính nó để lấy kết quả. Hãy để chúng tôi gọi phương pháp này là một phương pháp sản xuất.

Mã cho lớp là như thế này:

LỚP Lcl_sum ĐỊNH NGH .A.
KHU CÔNG CỘNG.
PHƯƠNG PHÁP: NHẬP KHẨU SUM_1 LOẠI i
GIÁ TRỊ TRẢ LẠI (rv_sum) LOẠI i.
KẾT THÚC. Lcl_sum xác định
*
BẮT ĐẦU-LỰA CHỌN.
* Không có gì ở đây
*
*
LỚP THỰC HIỆN Lcl_sum.
PHƯƠNG PHÁP TỔNG HỢP.
rv_sum = iv_1 * iv_1. Lỗi cố ý (tôi nhân thay vì thêm)
KẾT THÚC. Tổng cộng
KẾT THÚC. THỰC HIỆN lcl_sum.

Thiết lập lớp kiểm tra

Bây giờ tạo một lớp hoạt động như một lớp kiểm tra. Trong SAP, bạn sẽ cần thêm từ khóa KIỂM TRA khi xác định lớp. Sự bổ sung này tách lớp này khỏi mã sản xuất.

LỚP Lcl_test ĐỊNH NGH FORA ĐỂ KIỂM TRA
KHU CÔNG CỘNG.
PHƯƠNG PHÁP: m_sum ĐỂ KIỂM TRA.
KẾT THÚC. XÁC ĐỊNH Lcl_test
*
LỚP THỰC HIỆN Lcl_test.
PHƯƠNG PHÁP m_sum.
KẾT THÚC. M_sum
KẾT THÚC. THỰC HIỆN lcl_test

Thực hiện phương pháp thử

Trong phương pháp thử nghiệm này, điều bạn cần làm là - Kiểm tra mã sản xuất. Vì vậy, để có thể kiểm tra phương thức SUM của LCL_SUM, bạn cần khởi tạo một tham chiếu đối tượng đến LCL_SUM, gọi phương thức SUM gửi giá trị giả.

Dựa trên giá trị Dummy, phương thức sẽ gửi cho bạn kết quả - kết quả thực tế từ phương thức. Dựa trên giá trị giả, bạn biết giá trị kỳ vọng sẽ là bao nhiêu. Ví dụ. Nếu bạn chuyển số 3 sang phương thức SUM, nó sẽ cho bạn kết quả là 6 vì nó được thêm vào 3.

Khi bạn nhận được kết quả thực tế từ mã sản xuất hoặc phương pháp được thử nghiệm, bạn cần so sánh kết quả. Nếu thực tế so với dự kiến ​​không khớp, bạn cần cho hệ thống biết rằng có gì đó không đúng với thực tế so với Dự kiến ​​và hiển thị một thông báo phù hợp.

LỚP THỰC HIỆN Lcl_test.
PHƯƠNG PHÁP m_sum.
DỮ LIỆU: o_cut LOẠI REF ĐẾN lcl_sum.
DỮ LIỆU: lv_result LOẠI i.
*
TẠO ĐỐI TƯỢNG o_cut.
lv_result = o_cut-> tổng (3).
*
cl_aunit_assert => assert_equals (
EXP = 6
hành động = lv_result
thuyết minh = ‘có gì đó không đúng trong đầu ra
).
KẾT THÚC. M_sum
KẾT THÚC. THỰC HIỆN lcl_test

Kết quả kiểm tra đơn vị

Điều này cho tôi biết rằng, có một cái gì đó sai trong việc thực hiện phương pháp sản xuất.

Vâng, nếu bạn xem xét kỹ việc triển khai phương thức SUM, tôi có một lỗi đánh máy khi sử dụng Summation, tôi đã sử dụng Phép nhân. Vì vậy, tôi sẽ sửa nó và chạy lại thử nghiệm để thực hiện thành công.

Tôi đã được nối với TDD. FlabbergOK sẽ là từ đúng.

Điều đáng kinh ngạc là thời gian chu kỳ phát triển và thử nghiệm giảm đi rất nhiều.

Tôi đã quen viết mã cho phần tốt hơn của một giờ trước khi cố gắng biên dịch hoặc chạy nó. Nhưng ở đây, mã đã được thực thi và được kiểm tra cứ sau 2 phút.

Do đó, tóm lại, TDD được thực hiện thông qua các chu kỳ phát triển ngắn tuân theo quy tắc kiểm tra đơn vị viết đầu tiên, sau đó viết mã, sau đó tái cấu trúc, sau đó lặp lại. Các thử nghiệm đơn vị là các kiểm tra tự động kiểm tra xem các chức năng có hoạt động như mong đợi hay không. Bài kiểm tra đơn vị đầu tiên của bạn sẽ thất bại vì nó được viết trước khi bạn có bất kỳ cơ sở mã nào.

Bạn thêm một chút vào mã trường hợp thử nghiệm. Bạn thêm một chút vào mã sản xuất. Hai luồng mã phát triển đồng thời thành các thành phần bổ sung. Các xét nghiệm phù hợp với mã sản xuất giống như một kháng thể phù hợp với một kháng nguyên.

Biện pháp này ngăn các nhà phát triển viết mã không cần thiết mà không tuân thủ thử nghiệm đã cho.

Và toàn bộ cách tiếp cận tích hợp này cung cấp một loạt các lợi ích cho nhà phát triển.

Bạn sửa mã xấu mà không phá vỡ bất cứ điều gì.

Bất cứ khi nào bạn nhìn thấy mã xấu, bạn đảo mắt, cầu nguyện với Chúa và thốt ra một trong hai câu nói.

· "Đây là một mớ hỗn độn. Tôi đoán tôi phải sửa nó bằng cách nào đó.

· Tôi không chạm vào nó.

Hoặc là trường hợp, có một yếu tố sợ hãi liên quan. Trong thực tế, sự không chắc chắn.

Điều gì xảy ra nếu mã của tôi phá vỡ chức năng hiện có?

TDD giúp bạn chính xác để vượt qua sự không chắc chắn đó.

Điều quan trọng là chỉ ra rằng trong môi trường TDD, các nhà phát triển tập trung vào việc chạy thử nghiệm để ngăn ngừa lỗi thay vì xóa chúng sau khi mã được viết. Đây là một trong những lợi ích mạnh mẽ nhất của TDD. Khi bạn có một bộ các bài kiểm tra mà bạn tin tưởng, thì bạn sẽ mất tất cả nỗi sợ thực hiện các thay đổi. Khi bạn thấy mã xấu, bạn chỉ cần làm sạch nó ngay tại chỗ.

Và mã của bạn càng gọn gàng, nhóm của bạn càng phải nỗ lực ít hơn để thêm các tính năng mới hoặc sửa đổi cơ sở mã hiện có.

TDD Thực thi Tài liệu.

Dick Brandon đánh nó vào móng tay khi anh quan sát.

Tài liệu giống như sex; khi nó tốt, nó rất tốt, và khi nó xấu, nó tốt hơn không có gì.

Tài liệu là dầu thầu dầu của lập trình. Các nhà quản lý nghĩ rằng nó là tốt cho các lập trình viên và lập trình viên ghét nó!

một lý do phổ biến tại sao phạm vi creep xảy ra là thiếu tài liệu với các yêu cầu được xác định rõ ràng. Vấn đề này có thể được giảm thiểu thông qua phát triển theo hướng thử nghiệm.

Trong môi trường TDD, các nhà phát triển viết các bài kiểm tra đơn vị để kiểm tra các đoạn mã cụ thể. Các thử nghiệm đơn vị đóng vai trò là thông số kỹ thuật mô tả các tính năng chính xác cần được triển khai. Do đó, các thử nghiệm được chỉ định tốt ngăn các nhà phát triển viết mã thừa.

Và các bài kiểm tra đơn vị này là tài liệu. Họ mô tả thiết kế cấp thấp nhất của hệ thống. Chúng rõ ràng, chính xác, được viết bằng ngôn ngữ mà khán giả hiểu và trang trọng đến mức họ thực thi. Chúng là loại tài liệu cấp thấp tốt nhất có thể tồn tại.

TDD giúp thiết kế tốt hơn

Điều kiện tiên quyết cơ bản trong TDD là bạn phải viết các trường hợp kiểm thử đơn vị trước khi viết mã.

Vấn đề với mã kiểm tra là bạn phải cách ly mã đó. Thường rất khó để kiểm tra một chức năng nếu chức năng đó gọi các chức năng khác. Để viết bài kiểm tra đó, bạn đã phải tìm ra một cách nào đó để tách rời chức năng khỏi tất cả những người khác. Nói cách khác, trước tiên cần phải kiểm tra buộc bạn phải suy nghĩ về thiết kế tốt.

Điều này tạo ra một thiết kế tách rời tốt hơn, trong đó bạn có quyền kiểm soát tốt hơn đối với mọi thứ khi mã phát triển.

Mặc dù viết các trường hợp kiểm tra trả trước có thể tiêu tốn thời gian ban đầu nhưng điều này mang lại rất nhiều lợi ích. Các nhà phát triển thừa nhận rằng trước đây họ từng viết các dòng mã, nhận ra rằng các giải pháp của họ không liên quan và sau đó bắt đầu mã hóa lại từ đầu.

Không giống như các thực tiễn mã hóa lỗi thời, TDD cho phép các nhà phát triển quay trở lại bảng vẽ và tập trung vào việc thiết kế một kiến ​​trúc gọn nhẹ, linh hoạt.

Và thực tế việc viết các trường hợp kiểm tra trả trước ngăn chặn bất kỳ lỗi nào có thể xuất hiện sau đó do đó tiết kiệm thời gian, công sức và ợ nóng.

Và cuối cùng TDD tuân theo các thực tiễn mã hóa tốt nhất.

TDD thúc đẩy các nguyên tắc mã hóa tốt bao gồm DRY, KISS, YAGNI và RẮN.

Nguyên tắc DRY (Don vá Lặp lại chính mình) cho các nhà phát triển tránh lặp lại cùng một mã trong các phần khác nhau của cùng một hệ thống, đó là lý do tại sao đôi khi còn gọi là nguyên tắc DIE (Sao chép là Ác ma). DRY khuyến nghị các nhà phát triển sử dụng các lớp và chức năng để đóng gói chức năng hệ thống và duy trì một cơ sở mã nhất quán.

Nguyên tắc KISS (Keep it Simple, St ngu!) Khuyên các nhà phát triển không nên phát minh lại bánh xe, mà nên xây dựng các kiến ​​trúc đơn giản và rõ ràng. Bản chất của KISS là tránh các giải pháp quá kỹ thuật.

Nguyên tắc YAGNI (Bạn Ain mệnh Gonna Need It) chiến đấu mạ vàng. Mạ vàng có vẻ vô hại, đặc biệt nếu một nhà phát triển mong muốn tăng cường chức năng hiện có để làm hài lòng khách hàng. Tuy nhiên, nó dẫn đến thời gian phát triển thêm có thể gây ra sự chậm trễ của dự án hoặc một khách hàng không hài lòng. YAGNI làm rõ: nhà phát triển chỉ nên thực hiện các nhiệm vụ được giao và tránh thêm chức năng quá mức.

RẮN bao gồm năm nguyên tắc trong một: trách nhiệm duy nhất, đóng mở, thay thế Liskov, phân tách giao diện và đảo ngược phụ thuộc. Nói ngắn gọn, RẮN tuyên bố rằng tuân theo các nguyên tắc này làm cho các ứng dụng dễ bảo trì và kiểm tra hơn.

Tóm lại, TDD giúp tạo mã thanh lịch và đơn giản, dễ bảo trì.

Như Robert Martin đã khéo léo nói.

Mã Clean Clean luôn trông giống như được viết bởi một người quan tâm.

Người giới thiệu

Lập trình cực đoan: Kent Beck.

Phát triển phần mềm Agile: Robert Martin

Tái cấu trúc: Martin Fowler

Giới thiệu về tác giả-:

Ravi Rajan là một người quản lý chương trình CNTT toàn cầu có trụ sở tại Mumbai, Ấn Độ. Ông cũng là một blogger nhiệt tình, nhà văn thơ Haiku, người đam mê khảo cổ học và người mê lịch sử. Kết nối với Ravi trên LinkedIn, Medium và Twitter.

Câu chuyện này được xuất bản trong The Startup, ấn phẩm doanh nhân lớn nhất Medium Medium theo sau là +438.678 người.

Đăng ký để nhận những câu chuyện hàng đầu của chúng tôi ở đây.