- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Trong nỗ lực tìm hiểu thêm về kiểm thử tự động bằng cách thiết lập và chạy một dự án thử nghiệm C++ nhỏ với phạm vi bao phủ 100%, tôi đã gặp phải vấn đề sau - mặc dù tất cả các dòng mã thực tế của tôi và tất cả các nhánh thực thi đều được kiểm thử , lcov vẫn báo cáo hai dòng là chưa được kiểm tra (chúng chỉ chứa các định nghĩa hàm) và một phương thức hàm tạo "trùng lặp" được cho là chưa được kiểm tra, mặc dù nó khớp hoàn hảo với hàm tạo "thực" của tôi (hàm duy nhất được xác định và sử dụng).
(bỏ qua để chỉnh sửa trường hợp sao chép tối thiểu)
Nếu tôi tạo số liệu thống kê mức độ phù hợp tương tự bằng cách sử dụng tập lệnh python gcovr (từ cùng một nguồn chính xác, tệp .gcno và .gcda) và chuyển kết quả đến plugin Jenkins Cobertura, nó mang lại cho tôi 100% - các hàng trên tất cả các số lượng, Điều kiện và phương pháp .
Ý tôi là:
Trang báo cáo của Jenkins Cobertura:http://gints.dyndns.info/heap_std_gcovr_jenkins_cobertura.html (Mọi thứ đều ở mức 100%).
Tệp .gcda tương tự được xử lý bằng lcov:http://gints.dyndns.info/heap_std_lcov.html (Hai dòng định nghĩa hàm được đánh dấu là chưa được thực thi, mặc dù các dòng trong các hàm này bị ghi đè hoàn toàn và hàm Hit = function Total - 1).
Thống kê hàm từ tệp nguồn của lcov: http://gints.dyndns.info/heap_std_lcov_func (hiển thị hai định nghĩa hàm tạo giống hệt nhau, cả hai đều tham chiếu cùng một dòng mã trong tệp, một định nghĩa được đánh dấu là nhấn 5 lần, còn lại là 0 lần).
Nếu tôi xem tệp lcov .info trung gian:http://gints.dyndns.info/lcov_coverage_filtered.info.txtTôi thấy cũng có hai định nghĩa hàm tạo ở đó, chúng phải nằm trên cùng một dòng: FN:8,_ZN4BBOS8Heap_stdC1Ev & FN:8,_ZN4BBOS8Heap_stdC2Ev.
Ồ, đừng bận tâm đến sự nhầm lẫn xung quanh .uic bao gồm/hàm hủy, đó chỉ là cách xử lý Nhánh trong hàm hủy được gcov báo cáo là gì? Một cách bẩn thỉu. Tôi vừa thử nó khi chụp những ảnh chụp nhanh tập tin đó.
Có ai có đề xuất về cách giải quyết vấn đề này? Trình biên dịch C++ có thực hiện một số phép thuật "đằng sau hậu trường" ở đây không? (Có lẽ tôi nên đảm bảo tạo thêm bản sao của các hàm tạo có mục đích đặc biệt được gọi từ các thử nghiệm của mình?) Còn các định nghĩa hàm thông thường thì sao - ngay cả khi phần thân đã được kiểm tra đầy đủ, làm sao dòng xác định có thể không được kiểm tra? Đây có phải chỉ là một vấn đề với lcov? Mọi đề xuất đều được chào đón - Tôi muốn biếtTại saoĐiều gì sẽ xảy ra nếu thử nghiệm của tôi thực sự có một số tính năng chưa được phát hiện và Cobertura không nhắc...hoặc nếu không, tôi phải thực hiện lcov như thế nào? Bạn hiểu không?
EDIT: Đã thêm kịch bản repro tối thiểu bên dưới
lcov_repro_one_bad.cpp:
#include
lớp cha mẹ {
public:
Parent() ném() { }
khoảng trống ảo * Do_stuff(const unsigned m) Throw(std::runtime_error) =0;
};
lớp Con : cha mẹ công khai {
public:
Con() ném();
khoảng trống ảo * Do_stuff(const unsigned m)
Throw(std::runtime_error);
};
Con::Con()
ném()
: Cha mẹ()
{
}
void * Child::Do_stuff(const unsigned m)
ném(std::runtime_error)
{
const int a = m;
nếu ( a > 10 ) {
ném std::runtime_error("ôi!");
}
trả về NULL;
}
int main()
{
Con c;
c.Do_stuff(5);
thử {
c.Do_stuff(11);
}
bắt ( const std::runtime_error & ) { }
return 0;
}
Tạo tập tin:
GPP_FLAGS:=-fprofile-arcs -ftest-coverage -pedantic -pedantic-errors -W -Wall -Wextra -Werror -g -O0
tất cả:
g++ ${GPP_FLAGS} lcov_repro_one_bad.cpp -o lcov_repro_one_bad
./lcov_repro_one_bad
lcov --capture --directory ${PWD} --output-file lcov_coverage_all.info --base-directory ${PWD}
lcov --output-file lcov_coverage_filtered.info --extract lcov_coverage_all.info ${PWD}/*.*
genhtml --output-directory lcov_coverage_html lcov_coverage_filtered.info --demangle-cpp --sort --legend --highlight
Đây là báo cáo tôi nhận được từ nó:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_bad.cpp.gcov.html
Như bạn có thể thấy, cái gọi là dòng sai là định nghĩa về ngoại lệ mà hàm có thể đưa ra và hàm tạo sai bổ sung cho Trẻ em vẫn hiện diện trong danh sách hàm (nhấp vào hàm ở trên cùng).
Tôi đã thử xóa câu lệnh ném khỏi định nghĩa hàm, câu lệnh này sẽ xử lý các dòng không được thực thi trong phần khai báo hàm:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_v1.cpp.gcov.html (Hàm tạo bổ sung vẫn còn đó, như bạn có thể thấy).
Tôi đã thử di chuyển các định nghĩa hàm vào nội dung lớp thay vì định nghĩa chúng sau này, nhờ đó loại bỏ được hàm tạo bổ sung:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_v2.cpp.gcov.html (Tuy nhiên, như bạn có thể thấy, định nghĩa hàm Do_stuff vẫn còn hơi lạ).
Sau đó, tất nhiên, nếu tôi làm cả hai điều trên thì mọi thứ đều ổn:http://gints.dyndns.info/lcov_repro_bin/lcov_coverage_html/gints/lcov_repro/lcov_repro_one_ok.cpp.gcov.html
Nhưng tôi vẫn bối rối về nguyên nhân cốt lõi của việc này... và tôi vẫn muốn các phương thức của mình (bao gồm cả hàm tạo) được xác định trong một tệp .cpp riêng biệt, không phải trong nội dung lớp và tôi muốn các hàm của mình hoạt động tốt -các ngoại lệ được xác định có thể được ném ra!
Đây là mã nguồn trong trường hợp bạn muốn chơi với mã này:http://gints.dyndns.info/lcov_repro_src.zip
Có ý tưởng gì không?
Cảm ơn!
câu trả lời hay nhất
Ok, sau khi nhìn xung quanh và đọc các khai báo ngoại lệ C++, tôi nghĩ tôi hiểu chuyện gì đang xảy ra:
Theo như câu lệnh ném bị bỏ sót, có vẻ như mọi thứ ở đây thực sự đúng: câu lệnh ném hàm nên thêm mã bổ sung vào tệp mục tiêu đầu ra để kiểm tra các ngoại lệ ném bất hợp pháp (trong trường hợp câu lệnh ném). Vì tôi không kiểm tra tình huống xảy ra điều này nên điều hợp lý là mã không bao giờ được thực thi và những câu lệnh này bị đánh dấu là sai. Mặc dù tình hình ở đây không hề lý tưởng chút nào, nhưng ít nhất có thể biết được điều này đến từ đâu.
Đây dường như là một vấn đề đã được thảo luận từ lâu với gcc khi có liên quan đến các hàm tạo trùng lặp (và các bản vá khác nhau cố gắng giải quyết việc sao chép mã mục tiêu dẫn đến):http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3187 - Về cơ bản, hai phiên bản của hàm tạo được tạo - một cho lớp này và một cho các lớp con, và nếu muốn bao phủ 100%, bạn cần thực hành cả hai.
Về câu hỏi c++ - lcov: hàm tạo trùng lặp kỳ lạ được đánh dấu là không được bao phủ & hàm không được đánh dấu là được bao phủ, mặc dù các dòng của nó đã được thực thi, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/12807512/
Tôi cần một truy vấn có thể hiển thị số điểm cao nhất cho từng môn học. Giả sử 3 học sinh cần đạt 98 điểm môn khoa học tính điểm môn 3 98 Toán Câu trả lời đúng nhất tìm trước
Về trình thu gom rác Đồng thời-Mark-Sweep trong Java; tôi không rõ sự khác biệt giữa hai giai đoạn là gì. Tại sao bạn cần đánh dấu đồng thời? Thẻ ban đầu không tìm thấy tất cả các đối tượng Hoạt động phải không? Câu trả lời hay nhất sử dụng CMS, được gọi là
Tôi muốn biết truy vấn nhóm hoạt động như thế nào khi giả sử có một bảng Sinh viên (id, tên, điểm) Bây giờ nếu tôi muốn xuất tất cả sinh viên ngoại trừ sinh viên có điểm cao nhất, tại sao truy vấn này không hoạt động? CHỌN * TỪ Học sinh
Tôi đang sử dụng trình xem trước đánh dấu trong VSCode và muốn có thể đánh dấu một số văn bản trong tệp ".md" và bọc nó trong thẻ "" để khi xem tệp đánh dấu, nó sẽ được đánh dấu ở định dạng như vậy được đưa vào. Có cách nào nhanh chóng và dễ dàng
Thẻ Pragma không có tác dụng trong tệp Localizable.strings. Nếu tôi thêm MARK thứ hai: (dấu #pragma) trong Localizable.strings, xcode sẽ phát hành
Tôi thích sử dụng vim (trên ms windows), tôi nghĩ mọi người đều có một trình soạn thảo yêu thích, đây là của tôi. Trên một PC cụ thể, tôi gặp sự cố với lệnh mark[a-zA-Z]. Nó không hoạt động đối với các chữ cái a và
import java.util.*; vòng lặp lớp công khai { public static void main (String []args) { Scann
Tôi thích sử dụng vim (trên ms windows), tôi nghĩ mọi người đều có một trình soạn thảo yêu thích, đây là của tôi. Trên một PC cụ thể, tôi gặp sự cố với lệnh mark[a-zA-Z]. Nó không hoạt động đối với các chữ cái a và
Giả sử tôi có một danh sách chứa các hàm: . Nếu tôi muốn đánh giá chúng bằng BASCH, tôi có thể thực hiện việc này: . Nó hoạt động rất tốt. Tuy nhiên, tôi có hai vấn đề nhỏ với cách tiếp cận này. . Có vẻ như Exprs sẽ hữu ích cho lập luận của Mark vì nó cho phép tôi thực hiện một
Tôi đang viết playbook nâng cấp k8s của mình trong đó tôi cần thực hiện apt-mark unhold kubeadm . Bây giờ, tôi đang cố gắng tránh sử dụng lệnh ansible hoặc shell để gọi mô-đun apt if.
Tôi có 2 điều khiển danh sách cạnh nhau trong khu vực Xem của mình. Khi tôi chọn một mục trong danh sách 1, danh sách 2 sẽ được điền. Khi một mục được chọn trong danh sách2, các chi tiết sẽ được hiển thị bên ngoài mục đó trong Chế độ xem khác. Vì vậy, khi
Mục tiêu là đánh dấu từng kết quả khớp trong chuỗi bằng dấu ngoặc và trả về cùng một chuỗi cho mỗi dấu khớp, tức là: Pattern = "\\d+" Text = "e3e3e" want result = "e(3)e( 3)e"
Trong nỗ lực tìm hiểu thêm về kiểm thử tự động bằng cách thiết lập và chạy một dự án thử nghiệm C++ nhỏ với phạm vi bao phủ 100%, tôi đã gặp phải vấn đề sau - mặc dù tất cả các dòng mã thực tế của tôi và tất cả các nhánh thực thi đều được kiểm thử , lcov vẫn báo cáo hai dòng là chưa được kiểm tra
Tôi đã triển khai một hàm nhỏ phân tích câu lệnh SQL INSERT và làm nổi bật giá trị cột khi con trỏ ở trên tên cột và ngược lại. Sau đó, tôi muốn thêm khả năng chuyển nhanh giữa tên cột và giá trị cột. Tôi đang sử dụng dấu ấn trong quá trình triển khai của mình để có thể
Tôi có một biến searchString có chứa một chuỗi. Tôi phải liệt kê các tiêu đề tôi muốn lọc searchString. Tôi đã thử sử dụng thẻ để đánh dấu một phần của tiêu đề nhưng vẫn chưa thể làm được điều đó. Tôi cố gắng thực hiện một chức năng với 2
Tôi gặp phải sự cố lạ này khi sử dụng plugin AppCode IdeaVim. Sau khi cài đặt, mọi thứ dường như hoạt động tốt. Tuy nhiên tôi đã gặp phải một điều gì đó rất khó chịu. Bất cứ khi nào tôi cố gắng liệt kê các dấu bằng cách chạy lệnh :marks hoặc :registers
Đây là câu hỏi về cách triển khai đúng giao diện inputStream của Java. Việc triển khai của tôi không hỗ trợ chức năng đánh dấu/đặt lại. Do đó, nó trả về false từ phương thức markSupported. Trong trường hợp này tôi nên
Tôi đang xây dựng trang web dựa trên Tailwindcss đầu tiên của mình. Tôi muốn sửa đổi nhãn để văn bản được đánh dấu trông đẹp hơn. Đây là những gì tôi đã làm: mark { @apply inline-block pr-1 pl-1 py-0
Mình thấy màu nền mặc định là màu vàng. Nó được xác định ở đâu? Tôi không tìm thấy nó trong tài liệu tham khảo, không có màu tương ứng trong màu hệ thống CSS2. Các màu có luôn giống nhau không? Nó có phụ thuộc vào cài đặt trình duyệt hoặc GUI không? Có gì ở đó
Tôi không thể tìm ra chuỗi biểu thức chính xác để xóa nhiều ký tự ? Tôi muốn thay thế nhiều thứ tự? Sử dụng ?, nhưng ký tự nào để thoát... đang thoát khỏi tôi. Thông tin đầu vào ví dụ: Thứ này có bật không ???
Tôi là một lập trình viên xuất sắc, rất giỏi!