28/5/2004
(Tiếp nối phần trước…)
21/2/2002. 1000
Trong thập niên đầu của thế kỉ 20, Percival Lowell đã tiên đoán về sự tồn tại của hành tinh thứ 9 bằng cách nghiên cứu sự chuyển động của Thiên vương tinh. Mặc dù đã tìm kiếm nhưng ông đã chết trước khi hoàn thành tâm nguyện. Năm 1929, một chàng trai trẻ tên là Clyde Tombaugh đã đến đài thiên văn Lowell và bắt đầu lại công cuộc tìm kiếm của Lowell về hành tinh X. Phương pháp vừa thiếu thuyết phục vừa tẻ nhạt. Hai tấm ảnh, được chụp cùng vùng trời nhưng ở những đêm khác nhau, được đặt vào trong một thiết bị được biết tới với cái tên “blinker”. Blinker hiển thị hai tấm ảnh cùng một lúc,luân phiên giữa chúng một cách nhanh chóng. Bất kì vật thể nào trên bức ảnh nằm ở vị trí khác so với bức ảnh còn lại sẽ xuất hiện trong nháy mắt. Clyde Tombaugh tìm thấy sao Diêm Vương vào ngày 18 tháng 2 năm 1930. Mùa hè năm 1935, ông tìm thấy thần chết.
Các tờ báo đã gọi với cái tên tảng đá “Cylde”, và đem ra làm trò đùa trong vài ngày với ý kiến cho rằng Clyde thậm chí có thể va vào trái đất vào năm 1959. Nhưng rồi chiến tranh trên khắp thế giới xảy ra, và dù có thể có tảng đá tận thế đi nữa cũng khó giữ được sự chú ý của các bài báo quá lâu.Bên cạnh đó, như các nhà thiên văn học vẫn tiếp tục nói rằng, tỉ lệ của sự va chạm là 1 triệu/1.
Carole và Jasper chộp lấy một workstation khác để tiếp tục làm kiểm thử chấp nhận tiếp theo, trong khi Avery, Jerry và tôi bắt đầu công việc làm kiểm thử của Giám sát Bộ đồ thường chạy được.
“Được rồi, điều đầu tiên ta cần làm là viết một fixture cho bảng đầu tiên.” Jerry nói.
“Fixture là gì vậy?” Tôi hỏi.
“Fixture là một lớp Java liên kết bảng với ứng dụng DTrack.” Jerry đáp lại.
“Nhưng làm gì có ứng dụng DTrack nào.” Avery kêu ca.
“Đúng.” Jerry nói. “Chúng ta sẽ viết các kiểm thử và fixture trước để chắc chắn rằng ứng dụng được thiết kế có thể kiểm thử được.”
“Ơ, nghe như giống viết kiểm thử đơn vị trước vậy.” Tôi nói.
“Ừ, có một chút giống thế.” Jerry đáp lại, “ngoại trừ việc chúng ta viết toàn bộ kiểm thử và fixture trước khi viết bất kì ứng dụng nào. Nói đúng hơn là, chúng ta sẽ viết rất nhiều kiểm thử và fixture trước khi viết ứng dụng.”
“Một fixture trông như thế nào vậy?” Avery hỏi.
Jerry đẩy lên một kiểm thử mà hắn và Carole vừa mới hoàn thành. “Nhìn vào bảng đầu tiên đi.” Gã ta nói.
DTrack Context
Today’s date
2/21/2002
“Giờ thì hãy quan sát xem điều gì xảy ra ở bảng khi tao nhấn nút Kiểm tra”
“Có nghĩa là chúng ta phải viết một lớp có tên là DTrackContext ư?” Tôi hỏi.
“Đó chính xác là cái nó muốn nói tới.” Jerry nói, đưa cho tôi bàn phím. “Hãy đặt nó trong gói dtrack.fixtures.”
Tôi viết:
package dtrack.fixtures; public class DtrackContext { }
“Tuyệt.” Jerry nói. “Giờ thì biên dịch và chạy kiểm thử lần nữa đi.”
Dĩ nhiên là nó biên dịch mà không có vấn đề gì, nhưng khi tôi nhấn nút Kiểm tra, tôi gặp lỗi tương tự như trước.
“Mày biết tại sao không?” Jerry hỏi.
Tôi nghĩ là tôi biết lý do và đang định trả lời thì Avery đã chặn họng tôi bằng cách nói: “Vấn đề nằm ở chỗ classpath; FitNesse không biết tệp DTrackContext.class nằm ở đâu.”
“Đúng vậy, Avery.” Jerry tươi cười. Tôi có thể thấy điệu cười có chút tự mãn nhấp nháy trên khuôn mặt Avery.
Jerry lấy bàn phím và thực hiện các thay đổi sau cho trang kiểm thử:
!path C:\MyProjects\DosageTrackingSystem\classes !|DTrack Context| |Today's date| |2/21/2002|
Và cái bảng hiển thị như thế này:
“Tôi thấy có chút khác biệt ở cú pháp của nó.” Tôi nói. “Đường nét ở các dải phân cách ô của bảng. Nhưng cái dấu (!) lúc bắt đầu thế gì vậy?”
“Lúc này đừng để ý đến nó.” Jerry nói. “Mày có thể đọc trên FitNesse khi mày rảnh rỗi. Cú pháp đó rất dễ dùng. Giờ thì, chỉ tập trung vào việc fixture đã được viết. Vậy nên, hãy chạy kiểm thử đi.”
Tôi nhấn cái nút Kiểm tra, và thấy một lỗi sai khác.
“Tốt.” Jerry nói. “Nó đã tìm thấy lớp fixture.”
“Ừ, nhưng nó cũng nói đó không phải là fixture.” Avery kêu ca.
“Tao có thể sửa được.” Jerry nói ngay khi hắn ta lấy bàn phím. Gã tạo một số thay đổi như sau với lớp fixture.
package dtrack.fixtures; <strong>import fit.ColumnFixture; </strong>public class DTrackContext <strong>extends ColumnFixture </strong>{ }
“Trông tốt hơn rồi.” Jerry nói khi hắn nhấn nút Kiểm tra.
“Cũng không hẳn!” Avery nói với điệu cười giả tạo.
“Nó đang tìm cái gì được nhỉ?” Tôi hỏi. “Một biến ư?”
“Bingo!” Jerry nói và vẫn tiếp tục gõ.
package dtrack.fixtures; import fit.ColumnFixture; <strong>import java.util.Date; </strong>public class DTrackContext extends ColumnFixture { <strong>public Date todaysDate; </strong>}
“Ick!” Avery ré lên. “Một biến công khai! Đó chắc chắn không phải là cấu trúc OO!”
Jerry điềm tĩnh nhìn Avery và nói: “Thì làm sao?”
“Nó phá vỡ tính đóng gói!” Avery nói líu cả lưỡi với sự phẫn nộ chính đáng.
“Các lớp fixture không được đóng gói theo cách thông thường.” Jerry giải thích. “Các biến công khai là một trong những cách chúng ta giao tiếp với chúng. Dù sao thì cũng không có thời gian cho một bài giảng về các nguyên tắc thực sự của OO. Lúc này chúng ta muốn hoàn thành fixture.” Rồi gã nhấn nút Kiểm tra trong khi Avery đảo mắt một cách sốt ruột.
Avery thốt lên cùng với tiếng cười rất lớn: “Ôi trời! Mọi thứ đều hoạt động để làm cho nó nhìn trông bình thường trở lại!”
“Đúng vậy!” Jerry nói. “Giờ thì ta đã biết được rằng fixture đã được tìm thấy và dữ liệu đã vào được bên trong nó như dự kiến.”
“Trông nó không được đẹp như trước.” Tôi nói. “Tên của gói làm mọi thứ lộn xộn một chút. Tôi thích cái cách tên biến dùng khoảng trắng và dấu chấm câu. Tên của fixture không thể trùng nhau à?”
“Thật ra là có thế!” Jerry nói, và gã mở trang kiểm thử và làm vài sự thay đổi sau:
!path C:\MyProjects\DosageTrackingSystem\classes !3 Normal suit registration. <strong>!|Import| |dtrack.fixtures| </strong>'' * We assume that today is 2/21/2002.'' !|<strong>DTrack Context</strong>| |Today's date| |2/21/2002|
Và nó hiển thị như thế này:
“Được rồi, trông nó tuyệt hơn rồi đó.” Tôi nói. “Giờ chúng ta làm gì với ngày tháng đó đây?”
“Hỏi hay lắm.” Jerry nói. “Chúng ta cần đặt ngày tháng ở đâu đó mà phần còn lại của hệ thống DTrack có thể lấy nó từ đấy.”
Avery làm ra vẻ cao ngạo và nói: “Sẽ không dễ hơn nếu DTrack chỉ dùng lớp Date thông thường để lấy được ngày tháng của ngày hôm nay sao? Tại sao chúng ta phải phát minh ra một cơ chế hoàn toàn mới cho một thứ đơn giản như ngày tháng của ngày hôm nay?”
“Bởi vì các kiểm thử cần kiểm soát ngày tháng để đảm bảo ứng dụng quản lý nó một cách chính xác.” Jerry đáp lại, có một chút khó chịu.
“Ừ, nhưng công việc phát sinh đó làm chúng ta chậm lại! Chúng ta cần hoàn thành nó trong hai tháng!”
Avery cao giọng đủ để Carole vô tình nghe được. Cô nhanh chóng tiến lại, nhìn vào mắt Avery mà nói:
“Không đâu, Avery, nó không phải là việc phát sinh, và nó không làm chúng ta chậm lại. Chúng ta sẽ nhanh hơn rất nhiều khi chúng ta viết các kiểm thử này và xây dựng các hệ thống có thể kiểm thử được. Cậu nói đúng, Avery, chúng ta chỉ có hai tháng thôi. Và cách duy nhất là ta viết các kiểm thử tuân theo các nguyên tắc. Chúng ta đã làm nó bằng rất nhiều cách, phải không Jerry? (gã nhăn mặt nhưng không gật đầu)”—và tôi có thể nói với cậu rằng chừng nào tôi còn là khách hàng của dự án này, chúng ta vẫn sẽ viết các kiểm thử chấp nhận, và cậu sẽ làm theo cách mà Jerry chỉ dẫn.” Rồi cô ta sải bước trở lại chỗ Jasper với sự bực bội.
Avery tái nhợt trước những lời chỉ trích nặng nề của Carole. Giờ hắn nhìn Jerry và tôi và nói: “Oa!”
“Ừ, thỉnh thoảng cô ấy có thể có chút gay gắt.” Jerry từ tốn đáp. “Vấn đề là chúng tôi đã quyết định làm mọi việc theo cách này, và nếu mày muốn là thành viên của nhóm, mày sẽ phải tiếp tục nó.”
“Tôi vẫn nghĩ nó tốn thời gian.” Avery nói thầm.
“Tạm thời ngưng cái sự hoài nghi của mày lại một lúc.” Jerry nói. “Tin tao đi, chúng tôi không không phải những kẻ ngốc. Đây là cách tốt nhất để chúng ta tiến hành.”
Avery nhún vai nhưng không gật đầu đồng thuận. Hắn nhìn tôi rồi đảo mắt. Tôi liền tránh khỏi ánh mắt đó.
“Được rồi.” Tôi nói. “Giờ thì, ngày tháng đó như thế nào nhỉ? Làm cách nào fixture của chúng ta chuyển nó tới phần còn lại của hệ thống, và những phần đó nên làm thế nào để giành được sự truy cập vào ngày tháng?”
Jerry nhìn hai chúng tôi, rồi đừa tầm mắt qua vai gã tới chỗ Carole, người đang rất bộn rộn với Jasper, rồi gã nói một cách ngại ngùng: “Tao nghĩ đến giờ nghỉ giải lao rồi. Hãy ra ngoài một lúc và chúng ta có thể bàn về lý do tại biến công cộng đôi khi lại thích hợp.”
Vậy nên, cả ba chúng tôi rời khỏi phòng làm việc và đi tới phòng chờ gần nhất.