曾在工作之余,设想过一个能提升测试流程左侧效率的点子,结合人工智能,将自然语言自动转化为通用的功能用例、接口用例、代码单元测试用例等一系列用例,碰上这2年LLM模型大爆发,遂有自己炼一个用例生成的专用模型的想法。

(图片来源网络,侵删)
首要需求分析
-
用户需求:
- 用户能够以自然语言形式描述测试需求和条件,例如验证某个功能模块、检查特定的输入输出等。
- 用户期望系统能够根据输入的描述自动生成具体的测试用例,简化测试用例编写的工作量。
- 用户需要系统生成的测试用例具有可执行性、覆盖性和有效性,以确保软件质量和功能完整性。
-
功能需求:
(图片来源网络,侵删)- 自然语言处理:系统需具备自然语言处理能力,能够理解用户输入的测试需求和条件,提取关键信息。
- 生成测试用例:系统能够基于用户输入的描述,结合预训练的 LLM 大模型,自动生成符合要求的测试用例。
- 测试用例转换:系统需将生成的测试用例转换为可执行的代码片段或数据驱动的测试脚本,便于集成到现有测试流程中。
- 质量评估与筛选:系统应对生成的测试用例进行质量评估,确保用例的可执行性、覆盖性和有效性,并进行筛选和优化。
- 集成与部署:系统需提供稳定的测试用例生成服务,可以部署在云端或本地服务器,并与现有测试工具和流程进行集成。
-
非功能需求:
方案设计
-
数据收集与准备:
- 收集丰富多样的软件测试用例数据,包括各种测试场景、输入输出样例等。
- 对数据进行清洗、标注和归类,确保数据的质量和完整性。
-
模型训练:
- 使用预训练好的 LLM 大模型,结合自己收集和准备的测试用例数据,对模型进行进一步的微调和训练,以适应特定领域的测试用例生成需求。
- 可以采用生成式对抗网络(GAN)等方法增强模型的生成能力和稳定性。
-
输入和输出处理:
- 设计一个用户友好的界面,允许用户以自然语言形式输入测试需求和条件。例如,输入一个简单的描述,如“检查登录功能是否正常工作”。
- 将用户的自然语言输入转化为模型可理解的中间表达形式,如基于自然语言处理(NLP)和词嵌入技术的向量表示。
- 将模型生成的中间结果转化为可执行的测试用例代码,如代码片段或数据驱动的测试脚本。
-
质量控制和优化:
- 对生成的测试用例进行质量评估和筛选,确保生成的测试用例具有可执行性、覆盖性和有效性。
- 设计合适的评价指标或使用自动化测试工具对生成的测试用例进行自动执行和结果验证,从而提高生成质量。
- 不断收集用户反馈和数据反馈,进行模型的迭代和优化,以提供更准确、更高效的测试用例生成结果。
-
部署和集成:
- 将训练好的模型部署到云端或本地服务器,以提供稳定和高效的测试用例生成服务。
- 集成测试用例生成系统与现有的测试工具和流程,如自动化测试框架、CI/CD 管道等,提高整体的测试效率和自动化水平。
代码实现
第一步:使用transformers搭配开源的GPT2和Pytorch,写个粗略逻辑用来测试不微调的情况下完成度有多少
import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer def generate_test_case(model, tokenizer, input_text): # 编码 input_ids = tokenizer.encode(input_text, return_tensors="pt") # 模型生成测试用例 outputs = model.generate(input_ids=input_ids, max_length=50, num_return_sequences=1) # 解码生成的测试用例 test_case = tokenizer.decode(outputs[0], skip_special_tokens=True) return test_case # 加载预训练的 GPT-2 模型 model = GPT2LMHeadModel.from_pretrained("gpt2") tokenizer = GPT2Tokenizer.from_pretrained("gpt2") # 输入自然语言文本 input_text = "在登录页面点击“忘记密码”,然后输入邮箱地址进行验证" # 生成测试用例 test_case = generate_test_case(model, tokenizer, input_text) # 打印生成的测试用例 print("生成的测试用例:", test_case)
第二步:使用公开数据集来微调GPT2,再重复第一步的测试,直到达到预期效果
import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer, GPT2Config from torch.utils.data import Dataset, DataLoader # 自定义数据集类 class CustomDataset(Dataset): def __init__(self, texts, tokenizer, max_length): self.texts = texts self.tokenizer = tokenizer self.max_length = max_length def __len__(self): return len(self.texts) def __getitem__(self, idx): input_text = self.texts[idx] input_ids = self.tokenizer.encode(input_text, add_special_tokens=True, truncation=True, max_length=self.max_length) return torch.tensor(input_ids) # 批量生成数据 def collate_fn(data): input_ids = [item for item in data] input_ids = torch.stack(input_ids, dim=0) return input_ids # 定义模型和tokenizer model_name = "gpt2" # 可根据需要更换其他预训练模型 output_dir = "./fine_tuned_model" config = GPT2Config.from_pretrained(model_name) model = GPT2LMHeadModel.from_pretrained(model_name, config=config) tokenizer = GPT2Tokenizer.from_pretrained(model_name) # 加载并准备训练数据 train_data = ["测试用例1", "测试用例2", "测试用例3"] # 根据实际需求提供训练数据集 dataset = CustomDataset(train_data, tokenizer, max_length=128) # 自定义数据集 dataloader = DataLoader(dataset, batch_size=8, shuffle=True, collate_fn=collate_fn) # 数据加载器 # 定义训练参数 num_train_epochs = 3 # 训练轮数 learning_rate = 5e-5 # 学习率 warmup_steps = int(len(dataset) * num_train_epochs / 256 * 0.1) # 预热步数(10%的训练步数) # 将模型切换为训练模式,并移动到合适的设备 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) model.train() # 定义优化器和学习率调度器 optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.1) # 开始微调 for epoch in range(num_train_epochs): total_loss = 0 for batch in dataloader: inputs = batch.to(device) labels = inputs.clone() inputs = inputs[:, :-1] labels = labels[:, 1:] optimizer.zero_grad() outputs = model(inputs, labels=labels) loss = outputs.loss loss.backward() optimizer.step() scheduler.step() total_loss += loss.item() avg_loss = total_loss / len(dataloader) print("Epoch:", epoch+1, "Avg Loss:", avg_loss) # 保存微调后的模型 model.save_pretrained(output_dir) tokenizer.save_pretrained(output_dir)
这些代码的主要步骤如下:
- 定义了一个自定义数据集类 CustomDataset,用于加载并处理训练数据。
- 使用 GPT2LMHeadModel 类和预训练的 tokenizer 创建模型和 tokenizer 对象。
- 准备训练数据,将其封装在自定义数据集对象中,并使用 DataLoader 创建数据加载器。
- 将模型切换为训练模式,并将其移动到显卡上(我这里用A卡搭配ROCm)。
- 定义优化器和学习率调度器。
- 开始微调,遍历训练数据并执行前向传播、计算损失、反向传播和参数更新等步骤。
- 保存微调后的模型和 tokenizer。
在完成微调后,再重复第一步,使用微调后的模型来生成测试用例。
第三步:设计和实现用户UI操作界面
– //待进行
第四步:自动化测试平台的集成
– //待进行
– //完善数据处理流程以及用户操作界面和集成方式,以实现完整的自动化软件测试用例生成系统。