На сегодняшний день создано огромное количество программных продуктов, и их количество продолжает расти. На создание, тестирование, сопровождение требуются значительные ресурсы; если проект содержит миллионы строк программного кода, то ресурсов может потребоваться немыслимо много, и даже в таком случае выпустить продукт без дефектов и поддерживать его на должном уровне качества — задача трудновыполнимая [23]. При этом цена на обнаружение и исправление ошибки с течением времени значительно растёт [20], и не обнаруженный вовремя дефект может приводить к миллионным убыткам. Например, ошибка в программном обеспечении Маринера-1 стоила NASA сотни миллионов долларов.
Программисты, даже самые высококвалифицированные, совершают ошибки. Поэтому для повышения качества кода и минимизации количества дефектов конечного продукта необходимо проводить тестирование, начиная с самых ранних этапов разработки. Модульное тестирование — вид тестирования, ориентированный на обнаружение дефектов и программных регрессий в отдельных модулях системы [4]. Однако создание модульных тестов и поддержание их в актуальном состоянии — трудоёмкая деятельность, к тому же часто требующая написания большого количества шаблонного кода. Поэтому актуальна задача по автоматизации этого процесса.
Имеется множество инструментов, решающих данную задачу [9,17, 21], но покрытие кода при их использовании не максимально и может быть улучшено [15]. В текущей работе для повышения покрытия рассматривается идея комбинирования уже существующих инструментов генерации модульных тестов с фаззингом — исполнением программы с передачей на вход неправильных, неожиданных или случайных данных. Также представляет интерес то, каким образом различные виды фаззеров работают с различными алгоритмами генерации тестов, что в дальнейшем может быть использовано для создания собственного инструмента для генерации тестов.
В рамках данной работы будут рассмотрены основные инструменты для генерации модульных тестов и фаззинга, а также создана система, совмещающая эти инструменты, которая должна повысить покрытие тестируемого кода и позволить исследовать совместную работу инструментов.
В рамках данной работы были получены следующие результаты:
• создана система , совмещающая инструменты генерации тестов и фаззинга
— добавлены генераторы Randoop, EvoSuite;
— добавлен фаззер JQF+Zest;
• созданная система интегрирована в плагин к IntelliJ IDEA UTBot и также может быть запущена в инфраструктуре Java Unit Testing Tool Competition;
[1] Arcuri A., Iqbal M. Z., Briand L. Random Testing: Theoretical Re¬sults and Practical Implications //IEEE Transactions on SoftwareEngineering. —2012. —Vol. 38, no. 2. —P. 258-277.
[2] The Art, Science, and Engineering of Fuzzing: A Survey / V. J. M. Manes, H. Han, C. Han et al. //IEEE Transactions on Soft¬ware Engineering. — 2019. — P. 1-1.
[3] Cadar Cristian, Dunbar Daniel, Engler Dawson. KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Sys¬tems Programs // Proceedings of the 8th USENIX Conference on Operating Systems Design and Implementation. — OSDI’08. — USA : USENIX Association, 2008. — P. 209-224.
[4] Cohn Mike. Succeeding with Agile: Software Development Us¬ing Scrum. — 1st edition. — Addison-Wesley Professional, 2009. — ISBN:0321579364.
[5] Combining Unit-Level Symbolic Execution and System-Level ConcreteExecution for Testing Nasa Software / Corina S. Pundefinedsundefine- dreanu, Peter C. Mehlitz, David H. Bushnell et al. // Proceedings of the 2008 International Symposium on Software Testing and Analy¬sis. — ISSTA ’08. — New York, NY, USA : Association for Computing Machinery, 2008.—P. 15-26. — Access mode: https://doi.org/10.1145/1390630.1390635 (online; accessed: 17.12.2020).
[6] Cseppento Lajos, Micskei Zoltan. Evaluating code-based test input generator tools //Software Testing, Verification and Reliability. — 2017. —Vol. 27, no. 6. —P. e1627. — e1627 stvr.1627.
[7] Devroey Xavier, Panichella Sebastiano, Gambi Alessio.Java UnitTesting Tool Competition: Eighth Round // Proceedings of the IEEE/ACM 42nd International Conference on Software Engineering Workshops. — ICSEW’20. — New York, NY, USA : Association for Computing Machinery, 2020. — P. 545-548. — Access mode: https://doi.org/10.1145/3387940.3392265 (online; accessed: 17.12.2020).
[8] Feedback-Directed Random Test Generation/ Carlos Pacheco, Shu- vendu K. Lahiri, Michael D. Ernst, Thomas Ball // Proceedings of the 29th International Conference on Software Engineering. — ICSE ’07. — USA : IEEE Computer Society, 2007. — P. 75-84. — Access mode: https://doi.org/10.1109/ICSE.2007.37 (online; accessed: 17.12.2020).
[9] Fraser Gordon, Arcuri Andrea.EvoSuite: Automatic Test Suite Gen-eration for Object-Oriented Software // Proceedings of the 19th ACM SIGSOFT Symposium and the 13th European Conference on Founda-tions of Software Engineering. — ESEC/FSE ’11. — New York, NY, USA : Association for Computing Machinery, 2011.—P. 416-419.— Access mode: https://doi.org/10.1145/2025113.2025179 (online; accessed: 17.12.2020).
[10] Fraser G., Arcuri A. Whole Test Suite Generation //IEEE Transac¬tions on Software Engineering. — 2013. —Vol. 39, no. 2. — P. 276-291.
[11] Fuzzing: State of the Art / H. Liang, X. Pei, X. Jia et al. //IEEETransactions on Reliability. — 2018. — Vol. 67, no. 3. — P. 1199-1218.
[12] Godefroid Patrice.Test Generation Using Symbolic Execution// IARCS Annual Conference on Foundations of Software Technol¬ogy and Theoretical Computer Science (FSTTCS 2012) / Ed. by Deepak D’Souza, Telikepalli Kavitha, Jaikumar Radhakrishnan. — Vol. 18 of Leibniz International Proceedings in Informatics (LIPIcs). — Dagstuhl, Germany : Schloss Dagstuhl-Leibniz-Zentrum fuer Infor- matik, 2012.—P. 24-33. — Access mode: https://drops.dagstuhl.de/opus/volltexte/2012/3845 (online; accessed: 17.12.2020).
[13] An Industrial Evaluation of Unit Test Generation: Finding Real Faultsin a Financial Application/ M. M. Almasi, H. Hemmati, G. Fraser et al. // 2017 IEEE/ACM 39th International Conference on Software Engineering: Software Engineering in Practice Track (ICSE-SEIP).— 2017. —P. 263-272.
[14] Kersten Rody, Luckow Kasper, Pasareanu Corina S.POSTER: AFL-Based Fuzzing for Java with Kelinci // Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security. — CCS ’17. — New York, NY, USA : Association for Computing Ma¬chinery, 2017. — P. 2511-2513. — Access mode: https://doi.org/10.1145/3133956.3138820 (online; accessed: 17.12.2020).
[15] Kifetew Fitsum, Devroey Xavier, Rueda Urko.Java Unit TestingTool Competition: Seventh Round// Proceedings of the 12th Inter¬national Workshop on Search-Based Software Testing. — SBST ’19. — Montreal, Quebec, Canada : IEEE Press, 2019. — P. 15-20. — Ac¬cess mode: https://doi.org/10.1109/SBST.2019.00014 (online; ac¬cessed: 17.12.2020).
[16] King James C. Symbolic Execution and Program Testing //Com-mun. ACM. — 1976. — Jul.—Vol. 19, no. 7. — P. 385-394. — Access mode: https://doi.org/10.1145/360248.360252 (online; accessed: 17.12.2020).
[17] Pacheco Carlos, Ernst Michael D.Randoop: Feedback-Directed Ran¬dom Testing for Java// Companion to the 22nd ACM SIGPLAN Con¬ference on Object-Oriented Programming Systems and Applications Companion. — OOPSLA ’07. — New York, NY, USA : Association for Computing Machinery, 2007. — P. 815-816. — Access mode: https://doi.org/10.1145/1297846.1297902 (online; accessed: 17.12.2020).
[18] Padhye Rohan, Lemieux Caroline, Sen Koushik.JQF: Coverage-Guided Property-Based Testing in Java// Proceedings of the 28th ACM SIGSOFT International Symposium on Software Testing and Analysis. — ISSTA 2019. — New York, NY, USA : Association for Computing Machinery, 2019. — P. 398-401. — Access mode: https://doi.org/10.1145/3293882.3339002 (online; accessed: 17.12.2020).
[19] PerfFuzz: Automatically Generating Pathological Inputs / Caro¬line Lemieux, Rohan Padhye, Koushik Sen, Dawn Song // Proceed¬ings of the 27th ACM SIGSOFT International Symposium on Soft¬ware Testing and Analysis. — ISSTA 2018. — New York, NY, USA : Association for Computing Machinery, 2018. — P. 254-265. — Ac¬cess mode: https://doi.org/10.1145/3213846.3213874 (online; ac¬cessed: 17.12.2020).
[20] S.M.K Quadri, Farooq Sheikh Umar. Software Testing - Goals, Prin-ciples, and Limitations //International Journal of Computer Applica-tions.—2010.—09.—Vol. 6.
[21] SUSHI: A Test Generator for Programs with Complex StructuredInputs / Pietro Braione, Giovanni Denaro, Andrea Mattavelli, Mauro Pezze // Proceedings of the 40th International Conference on Software Engineering: Companion Proceeedings.—ICSE ’18.— New York, NY, USA : Association for Computing Machinery, 2018. — P. 21-24. — Access mode: https://doi.org/10.1145/3183440.3183472 (online; accessed: 17.12.2020).
[22] Semantic Fuzzing with Zest / Rohan Padhye, Caroline Lemieux, Koushik Sen et al. // Proceedings of the 28th ACM SIGSOFT Interna¬tional Symposium on Software Testing and Analysis. — ISSTA 2019. — New York, NY, USA : Association for Computing Machinery, 2019.— P. 329-340. — Access mode: https://doi.org/10.1145/3293882.3330576 (online; accessed: 17.12.2020).
[23] Simmonds Devon M. Complexity and the Engineering of Bug-Free Soft-ware // Proceedings of the International Conference on Frontiers in Education: Computer Science and Computer Engineering (FECS) / The Steering Committee of The World Congress in Computer Science, Computer .... — 2018. — P. 94-100.
[24] TesMa and CATG: Automated Test Generation Tools for Mod¬els of Enterprise Applications / Haruto Tanno, Xiaojing Zhang, Takashi Hoshino, Koushik Sen // Proceedings of the 37th Interna¬tional Conference on Software Engineering - Volume 2. — ICSE ’15. — Florence, Italy : IEEE Press, 2015.—P. 717-720.
[25] jFuzz: A concolic whitebox fuzzer for Java / Karthick Jayaraman, D Harvison, Vijay Ganesh, Adam Kiezun // Proceedings of the First NASA Formal Methods Symposium. — 2009. — 01. — P. 121-125.