Tôi cũng đã suy nghĩ về thử nghiệm trong mã chức năng.Tôi không có tất cả các câu trả lời, nhưng tôi sẽ viết một chút ở đây.
Các chương trình chức năng được đặt cùng nhau khác nhau và yêu cầu các phương pháp thử nghiệm khác nhau.
Nếu bạn có ngay cả những cái nhìn cursory nhất tại Haskell thử nghiệm, bạn chắc chắn sẽ đi qua QuickCheck và SmallCheck, hai thư viện kiểm tra Haskell rất nổi tiếng. Cả hai đều làm "thử nghiệm dựa trên thuộc tính". Trong một ngôn ngữ OO, bạn sẽ cố gắng viết các bài kiểm tra riêng lẻ để thiết lập nửa tá đối tượng giả, gọi một hoặc hai phương thức, và xác minh rằng các phương thức bên ngoài dự kiến được gọi với dữ liệu đúng và/hoặc phương thức cuối cùng trả về câu trả lời đúng. Đó là một chút công việc. Bạn có thể chỉ làm điều này với một hoặc hai trường hợp thử nghiệm.
QuickCheck là thứ khác. Bạn có thể viết một thuộc tính có nội dung "nếu tôi sắp xếp danh sách này, đầu ra phải có cùng số phần tử như đầu vào". Đây là một lớp lót. Thư viện QuickCheck sau đó sẽ tự động tự động tạo hàng trăm danh sách được tạo ngẫu nhiên và kiểm tra xem điều kiện được chỉ định có giữ được cho từng danh sách đơn lẻ hay không. Và nếu không, nó sẽ nhổ ra đầu vào chính xác mà thử nghiệm không thành công.
(Cả hai QuickCheck và SmallCheck làm khoảng điều tương tự. QuickCheck tạo ngẫu nhiên kiểm tra, trong khi SmallCheck có hệ thống cố gắng tất cả các kết hợp lên đến một giới hạn kích thước quy định.)
Bạn nói rằng bạn đang lo lắng về sự kết hợp của các đường dẫn kiểm soát dòng chảy có thể kiểm tra, nhưng với các công cụ như thế này tạo ra các trường hợp thử nghiệm cho bạn một cách năng động, viết thủ công đủ các kiểm thử không phải là một vấn đề. Vấn đề chỉ sắp xuất hiện với đủ dữ liệu để kiểm tra tất cả các đường dẫn.
Haskell cũng có thể trợ giúp điều đó. Tôi đọc một bài báo về một thư viện [Tôi không biết nếu nó đã được phát hành] mà thực sự sử dụng đánh giá lười biếng của Haskell để phát hiện những gì các mã theo thử nghiệm đang làm với các dữ liệu đầu vào. Như trong, nó có thể phát hiện xem chức năng bạn đang thử nghiệm có nhìn vào nội dung của một danh sách hay chỉ kích thước của danh sách đó. Nó có thể phát hiện các trường nào của hồ sơ Khách hàng đang được chạm vào. Và kể từ đó trở đi. Bằng cách này, nó tự động tạo dữ liệu, nhưng không lãng phí giờ tạo ra các biến thể ngẫu nhiên khác nhau của các phần dữ liệu thậm chí không có liên quan đến mã cụ thể này. (Ví dụ: nếu bạn sắp xếp Khách hàng theo ID, thì điều đó không quan trọng trong trường Tên.)
Đối với các chức năng thử nghiệm lấy hoặc tạo chức năng ... vâng, tôi không có câu trả lời cho cái đó.
Điều gì làm cho bạn nghĩ rằng các chức năng tùy chỉnh như mocks là bất kỳ đắt tiền hơn hoặc dễ bị lỗi hơn các đối tượng OO? – leftaroundabout
tôi thì không. đó là lý do tại sao tôi hỏi – piotrek
Tại sao bạn muốn thử một chức năng thuần túy? –