import json
import io
import requests
import html # For escaping HTML characters
from bs4 import BeautifulSoup
import pandas as pd # Added pandas for Excel export
from openai import OpenAI
# Initialize OpenAI API with Nvidia's Llama model
client = OpenAI(
base_url="https://integrate.api.nvidia.com/v1",
api_key="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"
)
def clean_test_case_output(text):
"""
Cleans the output to handle HTML characters and unwanted tags.
"""
text = html.unescape(text) # Unescape HTML entities
soup = BeautifulSoup(text, 'html.parser') # Use BeautifulSoup to handle HTML tags
cleaned_text = soup.get_text(separator="\n").strip() # Remove tags and handle newlines
return cleaned_text
def generate_testcases(user_story):
"""
Generates advanced QA test cases based on a provided user story by interacting
with Nvidia's llama model API. The prompt is refined for clarity,
and the output is processed for better quality.
:param user_story: A string representing the user story for which to generate test cases.
:return: A list of test cases in the form of dictionaries.
"""
# Few-shot learning examples to guide the model
few_shot_examples = """
"if its not a DropBury or ODAC Portal User Story, then we perform testing in Tech360 iOS App"
"Generate as many as testcases possible minimum 6 ,maximum it can be anything"
"Understand the story thoroughly"
"If it's a DropBury or ODAC Portal User Story, then we perform testing in ODAC Portal"
"""
# Combine the few-shot examples with the user story for the model to process
prompt = few_shot_examples + f"\nUser Story: {user_story}\n"
try:
# Call the Nvidia llama API with the refined prompt
completion = client.chat.completions.create(
model="meta/llama-3.1-405b-instruct",
messages=[
{"role": "user", "content": prompt}
],
temperature=0.03,
top_p=0.7,
max_tokens=4096,
stream=True
)
# Initialize an empty string to accumulate the response
test_cases_text = ""
# Accumulate the response from the streaming chunks
for chunk in completion:
if chunk.choices[0].delta.content is not None:
test_cases_text += chunk.choices[0].delta.content
# Ensure the entire response is captured before cleaning
if test_cases_text.strip() == "":
return [{"test_case": "No test cases generated or output was empty."}]
# Clean the output by unescaping HTML entities and replacing
tags
test_cases_text = clean_test_case_output(test_cases_text)
try:
# Try to parse the output as JSON, assuming the model returns structured test cases
test_cases = json.loads(test_cases_text)
if isinstance(test_cases, list):
return test_cases # Return structured test cases
else:
return [{"test_case": test_cases_text}] # Return as a list with the text wrapped in a dict
except json.JSONDecodeError:
# Fallback: return the raw text if JSON parsing fails
return [{"test_case": test_cases_text}]
except requests.exceptions.RequestException as e:
print(f"API request failed: {str(e)}")
return []
def export_test_cases(test_cases):
"""
Exports the test cases to an Excel file with specific columns:
- Test Case
- Preconditions
- Steps
- Expected Result
:param test_cases: A list of test case dictionaries or raw text.
:return: Bytes of the Excel file.
"""
if not test_cases:
return "No test cases to export."
# Define the structure of the Excel file
formatted_test_cases = []
for case in test_cases:
# Assuming each test case is a dictionary with 'test_case' content or similar
test_case_content = case.get('test_case', '')
# Split the content into separate sections (you might need to adjust based on actual output structure)
lines = test_case_content.split('\n')
test_case = ""
preconditions = ""
steps = ""
expected_result = ""
for line in lines:
if "Preconditions" in line:
preconditions = line.replace("Preconditions:", "").strip()
elif "Steps" in line:
steps = line.replace("Steps:", "").strip()
elif "Expected Result" in line:
expected_result = line.replace("Expected Result:", "").strip()
else:
# Default to putting the first part as the "Test Case"
if not test_case:
test_case = line.strip()
# Append to formatted test cases list
formatted_test_cases.append({
'Test Case': test_case,
'Preconditions': preconditions,
'Steps': steps,
'Expected Result': expected_result
})
# Convert the list of dictionaries into a DataFrame
df = pd.DataFrame(formatted_test_cases)
# Create an Excel file using pandas
output = io.BytesIO()
df.to_excel(output, index=False, engine='openpyxl') # Export to Excel without index
output.seek(0) # Rewind the buffer to the beginning
return output.getvalue()