8 điểm bởi ohjongin 2022-06-22 | 9 bình luận | Chia sẻ qua WhatsApp

Ngay cả với đoạn mã Kotlin đơn giản như thế này, việc kiểm thử mọi nhánh cũng khó đến mức gần như bất khả thi. Lý do là khi Kotlin biên dịch đoạn mã này thành bytecode, nó tạo ra những nhánh mà tác giả đoạn mã không hề chủ định.

when(answer) {
"yes" -> true
else -> false
}

Một mặt, Kotlin cung cấp nhiều tính năng tiện lợi cho lập trình viên khi viết mã; mặt khác, khi biên dịch thành bytecode, nó cũng tạo ra nhiều câu lệnh rẽ nhánh không lộ ra với người dùng như ví dụ này. jacoco, công cụ test coverage được dùng rộng rãi nhất trên nền tảng JVM, tính branch coverage dựa trên bytecode, nên có thể yêu cầu bao phủ cả những nhánh mà lập trình viên dùng Kotlin không hề nhận ra. Vì vậy, nếu một lập trình viên Kotlin cố đạt mức test coverage 100%, trong những trường hợp như trên họ có thể phải decompile để xem; và nếu còn kém may mắn hơn, việc decompile thất bại thì họ sẽ phải xem trực tiếp bytecode để kiểm tra xem có những nhánh nào.

9 bình luận

 
mse9000 2022-06-23

Mã không thể bao phủ

https://toss.im/slash-21/sessions/1-6

 
youknowone 2022-06-23

Việc bẻ cong code chỉ để cố đẩy coverage tracking lên 100% có cảm giác là đang đặt ngọn trước gốc.

 
innoceive 2022-06-23

Mã không bị bẻ cong. Chỉ là có những cách khác thuận tiện hơn từ góc nhìn của con người.

 
regentag 2022-06-23

Trong lĩnh vực quốc phòng (hệ thống vũ khí), theo chỉ thị của DAPA thì yêu cầu độ bao phủ mã 100%.
Trên thực tế rất khó đạt 100%, nhưng thay vào đó tôi biết là với từng chỗ không thể bao phủ thì phải ghi giải thích cụ thể vì sao không thể bao phủ.

 
doldari 2022-06-22

100% kiểm thử điên rồ…

 
roxie 2022-06-23

hahaha

 
ganadist 2022-06-22

Trong các trường hợp phân nhánh của enum / sealed / boolean, nếu không được xử lý đúng cách thì trình biên dịch đã thay đổi để trong Kotlin 1.6 phát ra cảnh báo, và từ 1.7 trở đi sẽ phát sinh lỗi.

https://youtrack.jetbrains.com/issue/KT-47709

 
525hm 2022-06-22

Mình đã đọc nội dung trên slash 21 rất kỹ haha

 
ohjongin 2022-06-22

À~ thì ra là nội dung từ slash 21... Tôi thấy lần đầu trên Twitter của người quen nên không biết... Xin lỗi vì đến muộn...