Skip to content

Commit 3be1457

Browse files
Adding strict-coverage option and removing prompt only. (#78)
1 parent 5685c9f commit 3be1457

File tree

4 files changed

+42
-42
lines changed

4 files changed

+42
-42
lines changed

cover_agent/CoverAgent.py

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import os
33
import shutil
4+
import sys
45
import wandb
56

67
from cover_agent.CustomLogger import CustomLogger
@@ -47,59 +48,57 @@ def _duplicate_test_file(self):
4748
self.args.test_file_output_path = self.args.test_file_path
4849

4950
def run(self):
50-
5151
if 'WANDB_API_KEY' in os.environ:
5252
wandb.login(key=os.environ['WANDB_API_KEY'])
5353
time_and_date = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
5454
run_name = f"{self.args.model}_" + time_and_date
5555
wandb.init(project="cover-agent", name=run_name)
5656

57-
if not self.args.prompt_only:
58-
iteration_count = 0
59-
test_results_list = []
60-
61-
self.test_gen.initial_test_suite_analysis()
57+
iteration_count = 0
58+
test_results_list = []
6259

63-
while (
64-
self.test_gen.current_coverage < (self.test_gen.desired_coverage / 100)
65-
and iteration_count < self.args.max_iterations
66-
):
67-
self.logger.info(
68-
f"Current Coverage: {round(self.test_gen.current_coverage * 100, 2)}%"
69-
)
70-
self.logger.info(f"Desired Coverage: {self.test_gen.desired_coverage}%")
60+
self.test_gen.initial_test_suite_analysis()
7161

72-
generated_tests_dict = self.test_gen.generate_tests(max_tokens=4096)
62+
while (
63+
self.test_gen.current_coverage < (self.test_gen.desired_coverage / 100)
64+
and iteration_count < self.args.max_iterations
65+
):
66+
self.logger.info(
67+
f"Current Coverage: {round(self.test_gen.current_coverage * 100, 2)}%"
68+
)
69+
self.logger.info(f"Desired Coverage: {self.test_gen.desired_coverage}%")
7370

74-
for generated_test in generated_tests_dict.get("new_tests", []):
75-
test_result = self.test_gen.validate_test(
76-
generated_test, generated_tests_dict
77-
)
78-
test_results_list.append(test_result)
71+
generated_tests_dict = self.test_gen.generate_tests(max_tokens=4096)
7972

80-
iteration_count += 1
73+
for generated_test in generated_tests_dict.get("new_tests", []):
74+
test_result = self.test_gen.validate_test(
75+
generated_test, generated_tests_dict
76+
)
77+
test_results_list.append(test_result)
8178

82-
if self.test_gen.current_coverage < (
83-
self.test_gen.desired_coverage / 100
84-
):
85-
self.test_gen.run_coverage()
79+
iteration_count += 1
8680

87-
if self.test_gen.current_coverage >= (self.test_gen.desired_coverage / 100):
88-
self.logger.info(
89-
f"Reached above target coverage of {self.test_gen.desired_coverage}% (Current Coverage: {round(self.test_gen.current_coverage * 100, 2)}%) in {iteration_count} iterations."
90-
)
91-
elif iteration_count == self.args.max_iterations:
92-
self.logger.info(
93-
f"Reached maximum iteration limit without achieving desired coverage. Current Coverage: {round(self.test_gen.current_coverage * 100, 2)}%"
94-
)
81+
if self.test_gen.current_coverage < (
82+
self.test_gen.desired_coverage / 100
83+
):
84+
self.test_gen.run_coverage()
9585

96-
ReportGenerator.generate_report(
97-
test_results_list, self.args.report_filepath
98-
)
99-
else:
86+
if self.test_gen.current_coverage >= (self.test_gen.desired_coverage / 100):
10087
self.logger.info(
101-
f"Prompt only option requested. Skipping call to LLM. Prompt can be found at: {self.args.prompt_only}"
88+
f"Reached above target coverage of {self.test_gen.desired_coverage}% (Current Coverage: {round(self.test_gen.current_coverage * 100, 2)}%) in {iteration_count} iterations."
10289
)
90+
elif iteration_count == self.args.max_iterations:
91+
failure_message = f"Reached maximum iteration limit without achieving desired coverage. Current Coverage: {round(self.test_gen.current_coverage * 100, 2)}%"
92+
if self.args.strict_coverage:
93+
# User requested strict coverage (similar to "--cov-fail-under in pytest-cov"). Fail with exist code 2.
94+
self.logger.error(failure_message)
95+
sys.exit(2)
96+
else:
97+
self.logger.info(failure_message)
98+
99+
ReportGenerator.generate_report(
100+
test_results_list, self.args.report_filepath
101+
)
103102

104103
if 'WANDB_API_KEY' in os.environ:
105104
wandb.finish()

cover_agent/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ def parse_args():
8181
help="The API url to use for Ollama or Hugging Face. Default: %(default)s.",
8282
)
8383
parser.add_argument(
84-
"--prompt-only",
84+
"--strict-coverage",
8585
action="store_true",
86-
help="Generate the prompt only (i.e. do not run the test or call to the LLM). Default: False.",
86+
help="If set, Cover-Agent will return a non-zero exit code if the desired code coverage is not achieved. Default: False.",
8787
)
8888

8989
return parser.parse_args()

cover_agent/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.41
1+
0.1.42

tests_integration/test_with_docker.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ COMMAND="/usr/local/bin/cover-agent \
7676
--test-command \"$TEST_COMMAND\" \
7777
--coverage-type \"cobertura\" \
7878
--desired-coverage 70 \
79-
--max-iterations 1"
79+
--max-iterations 1 \
80+
--strict-coverage"
8081

8182
if [ -n "$MODEL" ]; then
8283
COMMAND="$COMMAND --model \"$MODEL\""

0 commit comments

Comments
 (0)