|
import json |
|
import csv |
|
import io |
|
import requests |
|
import html |
|
from bs4 import BeautifulSoup |
|
from openai import OpenAI |
|
|
|
|
|
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) |
|
soup = BeautifulSoup(text, 'html.parser') |
|
cleaned_text = soup.get_text(separator="\n").strip() |
|
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_examples = """ |
|
|
|
"if app is mentioned then its tech360 otherwise something like ODAC or drop bury mentioned then we need to test in ODAC Portal,generate minimum 10 testcases but can you can create more than 10 if possible with clear steps and understand the user story throughly" |
|
|
|
Example 1: |
|
User Story: |
|
Ensure the "Key Details" feature is enabled in the backend. |
|
1. Open the Tech 360 app. |
|
2. Click on the Search tab. |
|
3. Enter the account number and click on Enter. |
|
4. Choose the account from the Search result. |
|
5. Verify that the "Key Details" button is displayed under the recommendation section. |
|
6. Clicking on "Key Details" should navigate to the key details screen. |
|
|
|
Test Case: |
|
Test Case: Verify "Key Details" Feature in Tech 360 App |
|
Steps: |
|
1. Launch the Tech 360 app. |
|
2. Go to the Search tab. |
|
3. Enter a valid account number and click Enter. |
|
4. Select an account from the search results. |
|
5. Ensure the "Key Details" button is displayed under the recommendation section. |
|
6. Click on "Key Details" and verify that it navigates to the Key Details screen. |
|
Expected Result: User is navigated to the Key Details screen successfully. |
|
|
|
Example 2: |
|
User Story: |
|
Open the Tech 360 app. Go On-Job on a Wi-Fi Ready Preinstall Job. Wait for PHT to finish. Go to the Device Details Page for XB7 and ONU. |
|
|
|
Test Case: |
|
Test Case: Verify Device Details Page for XB7 and ONU in Wi-Fi Ready Preinstall Job |
|
Steps: |
|
1. Launch the Tech 360 app. |
|
2. Go On-Job on a Wi-Fi Ready Preinstall Job. |
|
3. Wait for PHT to finish. |
|
4. Navigate to the Device Details Page for XB7 and ONU. |
|
Expected Result: Device details for XB7 and ONU are displayed correctly. |
|
|
|
Example 3: |
|
User Story: |
|
Open the Tech 360 app. Go On-Job on a Wi-Fi Ready Preinstall Job. Initiate Add/Remove/Swap Flows for ONU and XB7. |
|
|
|
Test Case: |
|
Test Case: Verify Add/Remove/Swap Flows for ONU and XB7 in Wi-Fi Ready Preinstall Job |
|
Steps: |
|
1. Launch the Tech 360 app. |
|
2. Go On-Job on a Wi-Fi Ready Preinstall Job. |
|
3. Initiate Add/Remove/Swap flows for ONU and XB7. |
|
Expected Result: Add/Remove/Swap flows for ONU and XB7 are initiated and processed successfully. |
|
""" |
|
|
|
|
|
prompt = few_shot_examples + f"\nUser Story: {user_story}\n" |
|
|
|
try: |
|
|
|
completion = client.chat.completions.create( |
|
model="meta/llama-3.1-405b-instruct", |
|
messages=[ |
|
{"role": "user", "content": prompt} |
|
], |
|
temperature=1.0, |
|
top_p=0.7, |
|
max_tokens=4096, |
|
stream=True |
|
) |
|
|
|
|
|
test_cases_text = "" |
|
|
|
|
|
for chunk in completion: |
|
if chunk.choices[0].delta.content is not None: |
|
test_cases_text += chunk.choices[0].delta.content |
|
|
|
|
|
|
|
if test_cases_text.strip() == "": |
|
return [{"test_case": "No test cases generated or output was empty."}] |
|
|
|
|
|
test_cases_text = clean_test_case_output(test_cases_text) |
|
|
|
try: |
|
|
|
test_cases = json.loads(test_cases_text) |
|
if isinstance(test_cases, list): |
|
return test_cases |
|
|
|
else: |
|
return [{"test_case": test_cases_text}] |
|
|
|
except json.JSONDecodeError: |
|
|
|
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, format='json'): |
|
if not test_cases: |
|
return "No test cases to export." |
|
|
|
|
|
structured_test_cases = [{'Test Case': case} for case in test_cases] |
|
|
|
if format == 'json': |
|
|
|
return json.dumps(test_cases, indent=4, separators=(',', ': ')) |
|
elif format == 'csv': |
|
if isinstance(test_cases, list) and isinstance(test_cases[0], dict): |
|
output = io.StringIO() |
|
csv_writer = csv.DictWriter(output, fieldnames=test_cases[0].keys(), quoting=csv.QUOTE_ALL) |
|
csv_writer.writeheader() |
|
csv_writer.writerows(test_cases) |
|
return output.getvalue() |
|
else: |
|
raise ValueError("Test cases must be a list of dictionaries for CSV export.") |
|
|
|
|
|
def save_test_cases_as_file(test_cases, format='json'): |
|
if not test_cases: |
|
return "No test cases to save." |
|
|
|
if format == 'json': |
|
with open('test_cases.json', 'w') as f: |
|
json.dump(test_cases, f) |
|
elif format == 'csv': |
|
with open('test_cases.csv', 'w', newline='') as file: |
|
dict_writer = csv.DictWriter(file, fieldnames=test_cases[0].keys()) |
|
dict_writer.writeheader() |
|
dict_writer.writerows(test_cases) |
|
else: |
|
return f"Unsupported format: {format}" |
|
return f'{format} file saved' |
|
|