Kiểm thử đơn vị chỉ hữu ích nếu kiểm tra thực hiện đúng chức năng đã nói, không sử dụng đúng, vì kiểm thử đơn vị không thể nói rằng một chức năng sẽ không được gọi từ một luồng khác trong phần còn lại của cơ sở mã của bạn, giống như nó có thể ' Chúng tôi nói rằng các hàm sẽ không được gọi với các tham số vi phạm các điều kiện tiên quyết của chúng (và về mặt kỹ thuật những gì bạn đang thử nghiệm về cơ bản là vi phạm điều kiện tiên quyết trong sử dụng, đây là điều bạn không thể kiểm tra một cách hiệu quả vì thử nghiệm có thể ' Tuy nhiên, hạn chế cách các vị trí khác trong cơ sở mã sử dụng các chức năng đó, tuy nhiên, bạn có thể kiểm tra xem việc vi phạm các điều kiện tiên quyết có dẫn đến lỗi / ngoại lệ hay không.
Đây là một trường hợp khẳng định với tôi khi thực hiện các chức năng có liên quan như một số người khác đã chỉ ra, hoặc thậm chí tinh vi hơn là đảm bảo các chức năng này an toàn cho luồng (mặc dù điều này không phải lúc nào cũng thực tế khi làm việc với một số API).
Cũng chỉ là một ghi chú bên cạnh nhưng "chủ đề chính"! = "Chủ đề giao diện người dùng" trong mọi trường hợp. Nhiều API GUI không an toàn cho luồng (và làm cho bộ GUI an toàn luồng bị hỏng rất nhiều), nhưng điều đó không có nghĩa là bạn phải gọi chúng từ cùng một luồng như luồng có điểm vào cho ứng dụng của bạn. Điều đó có thể hữu ích ngay cả khi triển khai các xác nhận của bạn bên trong các chức năng UI có liên quan để phân biệt "luồng UI" với "luồng chính", như chụp ID luồng hiện tại khi một cửa sổ được tạo để so sánh với thay vì từ điểm nhập chính của ứng dụng (đó là ít nhất là giảm số lượng các giả định / hạn chế sử dụng mà việc triển khai chỉ áp dụng cho những gì thực sự phù hợp).
An toàn chủ đề thực sự là điểm vấp "gotcha" trong một nhóm cũ của tôi và trong trường hợp cụ thể của chúng tôi, tôi đã gọi nó là "tối ưu hóa vi mô" phản tác dụng nhất trong số chúng có thể phát sinh nhiều chi phí bảo trì hơn lắp ráp viết tay. Chúng tôi đã có phạm vi bảo hiểm mã khá toàn diện trong các thử nghiệm đơn vị của mình, cùng với các thử nghiệm tích hợp khá phức tạp, chỉ gặp phải các bế tắc và điều kiện chạy đua trong phần mềm trốn tránh các thử nghiệm của chúng tôi. Và đó là bởi vì các nhà phát triển đã sử dụng mã đa luồng một cách ngớ ngẩn mà không nhận thức được mọi tác động phụ có thể xảy ra trong chuỗi các lệnh gọi có thể xảy ra từ chính họ, với một ý tưởng khá ngây thơ rằng họ có thể khắc phục các lỗi như vậy chỉ bằng cách ném khóa quanh trái và phải,
Tôi đã bị lệch về hướng ngược lại như một kiểu trường học cũ không tin tưởng đa luồng, là một người đến sau thực sự để nắm lấy nó, và nghĩ rằng sự đúng đắn đánh bại hiệu suất đến mức hiếm khi sử dụng hết tất cả các lõi này mà chúng ta có bây giờ, cho đến khi tôi phát hiện ra mọi thứ như các hàm thuần túy và các thiết kế bất biến và các cấu trúc dữ liệu bền bỉ cuối cùng cho phép tôi sử dụng hoàn toàn phần cứng đó mà không phải lo lắng về thế giới về điều kiện chủng tộc và các bế tắc. Tôi phải thừa nhận rằng cho đến tận năm 2010 hoặc lâu hơn, tôi ghét sự đa luồng với một niềm đam mê ngoại trừ một vài vòng lặp song song ở đây và ở những khu vực tầm thường để lý giải về an toàn luồng, và ưa thích mã tuần tự hơn nhiều cho thiết kế sản phẩm cho tôi đau buồn với đa luồng trong các đội cũ.
Đối với tôi, cách đa luồng trước và sửa lỗi sau là một chiến lược khủng khiếp để đa luồng đến mức gần như khiến tôi ghét đa luồng ban đầu; bạn có thể đảm bảo rằng các thiết kế của bạn an toàn cho chủ đề chắc chắn và việc triển khai chúng chỉ sử dụng các chức năng với các đảm bảo tương tự (ví dụ: các hàm thuần túy) hoặc bạn tránh đa luồng. Điều đó có thể bắt gặp một chút giáo điều nhưng nó đánh bại việc phát hiện (hoặc tệ hơn, không phát hiện ra) các vấn đề khó tái tạo trong nhận thức muộn mà thử nghiệm. Sẽ không có điểm nào tối ưu hóa một động cơ tên lửa nếu điều đó sẽ dẫn đến việc nó dễ bị nổ bất ngờ giữa nửa đường màu xanh dọc hành trình ra ngoài vũ trụ.
Nếu bạn chắc chắn phải làm việc với mã không an toàn cho chuỗi, thì tôi không thấy đó là vấn đề cần giải quyết với kiểm thử đơn vị / tích hợp rất nhiều. Lý tưởng sẽ là hạn chế truy cập . Nếu mã GUI của bạn được tách rời khỏi logic nghiệp vụ, thì bạn có thể thực thi một thiết kế hạn chế quyền truy cập vào các cuộc gọi đó từ bất kỳ thứ gì khác ngoài luồng / đối tượng tạo ra nó *. Đó là chế độ lý tưởng đối với tôi là làm cho các luồng khác không thể gọi các hàm đó hơn là cố gắng đảm bảo chúng không hoạt động.
- Vâng, tôi nhận ra rằng luôn có những cách xung quanh bất kỳ hạn chế thiết kế nào mà bạn thi hành thường là nơi trình biên dịch không thể bảo vệ bạn. Tôi chỉ đang nói thực tế; nếu bạn có thể trừu tượng đối tượng "GUI Thread" hoặc bất cứ điều gì, thì đó có thể là người duy nhất trao tham số cho các đối tượng / chức năng GUI và bạn có thể hạn chế đối tượng đó truy cập vào các luồng khác. Tất nhiên, nó có thể vượt qua và đào sâu và tìm đường xung quanh các vòng như vậy để truyền các chức năng / đối tượng GUI đã nói đến các luồng khác để gọi, nhưng ít nhất có một rào cản ở đó và bạn có thể gọi bất kỳ ai làm "kẻ ngốc" đó ", Và không sai, ít nhất, vì đã bỏ qua rõ ràng và tìm kiếm sơ hở cho những gì thiết kế rõ ràng đang cố gắng hạn chế. :-D Đó '