Использование генерации утверждения мутации EvoSuite для улучшения существующего модульного тестаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Использование генерации утверждения мутации EvoSuite для улучшения существующего модульного теста

Сообщение Anonymous »

Я пытаюсь написать программу для генерации блюд Java Unit Test (хотя язык кодирования - это Python). < /p>
Поскольку я использую Python, я решил использовать командную строку Evosuite будет самым простым способом интеграции с ним.
Я хочу использовать мутацию Evosuite. /> Практически я сделал класс, который дал: < /p>

Папка с файлами .class как исходного кода, так и модульного теста. /> Я использовал JDK 1.8.0_202 для составления файлов и для использования файла инструментов. Вот моя реализация: < /li>
< /ul>
import subprocess
import shutil
import os

class MutationAssertionGenerator:
def __init__(self, classfiles_dir, java_file_path, output_dir):
"""
Initializes the MutationAssertionGenerator.

:param classfiles_dir: Path to the compiled Java classes.
:param java_file_path: Path to the Java file being tested.
:param output_dir: Directory where the modified test will be saved.
:param evosuite_jar: Path to the EvoSuite JAR file.
"""
self.evosuite_jar = os.path.abspath(r'PATH-TO-JAR')
self.classfiles_dir = os.path.abspath(classfiles_dir)
self.output_dir = os.path.abspath(output_dir)

# Java setup
self.java_bin = r"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe"
self.tools_jar = r"C:\Program Files\Java\jdk1.8.0_202\lib\tools.jar"

# Extract class name and package from Java file
self.java_file_name = os.path.basename(java_file_path).replace(".java", "")
with open(java_file_path, "r", encoding="utf-8") as file:
java_code = file.read()
self.package_name = self.extract_package_name(java_code)
self.fully_qualified_name = f"{self.package_name}.{self.java_file_name}" if self.package_name else self.java_file_name

# Set up classpath (compiled classes + lib JARs + tools.jar)
self.lib_jars_path = os.path.abspath(os.path.join("lib", "jars"))
jar_files = [os.path.join(self.lib_jars_path, f) for f in os.listdir(self.lib_jars_path) if f.endswith('.jar')]

self.classpath = os.pathsep.join([self.classfiles_dir] + jar_files + [self.tools_jar])

# Ensure output directory exists
os.makedirs(self.output_dir, exist_ok=True)

@staticmethod
def extract_package_name(java_code):
"""Extracts package name from Java source code."""
for line in java_code.splitlines():
line = line.strip()
if line.startswith("package "):
return line.split(" ")[1].rstrip(";")
return ""

def run_mutation_assertions(self):
"""
Runs EvoSuite mutation assertion generation on the provided test class.
"""
command = [
self.java_bin,
f"-Dtools_jar_location={self.tools_jar}",
"-cp", f"{self.evosuite_jar}{os.pathsep}{self.classpath}",
"org.evosuite.EvoSuite",
"-class", self.fully_qualified_name, # Fully qualified class name
"-projectCP", self.classfiles_dir,
"-Dassertion_strategy=MUTATION"
]

try:
process = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print("EvoSuite Output:\n", process.stdout)
print("EvoSuite Errors:\n", process.stderr)

# Check if EvoSuite completed successfully
if process.returncode == 0:
print(f"Mutation assertions generated successfully for {self.fully_qualified_name}.")
self.save_modified_test()
else:
print(f"Error during EvoSuite execution: {process.stderr}")

except Exception as e:
print(f"Error running EvoSuite: {str(e)}")

def save_modified_test(self):
"""
Moves the modified test file to the specified output directory.
"""
generated_test_dir = os.path.join(os.getcwd(), "evosuite-tests")
package_path = self.package_name.replace(".", "/") if self.package_name else ""
generated_test_file = os.path.join(generated_test_dir, package_path, f"{self.java_file_name}_ESTest.java")

if os.path.exists(generated_test_file):
final_path = os.path.join(self.output_dir, os.path.basename(generated_test_file))
shutil.move(generated_test_file, final_path)
print(f"Modified test saved to: {final_path}")
else:
print("Error: Modified test file not found.")
< /code>
Хотя этот класс работает и генерирует модульный тест, он не использует мой существующий модульный тест. Есть ли способ обеспечить эвосуит с существующим модульным тестом для улучшений?

Подробнее здесь: https://stackoverflow.com/questions/795 ... -unit-test
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»