Huajiの小窝.

vbs自动化测试

2024/12/25
loading

vbs进行自动化测试

这几天有个课程设计要做,队友是@LTL-77和老卢,是基于余弦相似度实现的代码查重,✌主要负责调试分析的,所以从leetcode上面ctrl+cctrl+v下来了百来个样本(为什么这个网站会那么卡?),先用某种方法(AI)把所有题目名称弄下来,第一页如下(内容太多就不完全展示了):

1
2
3
4
5
6
"exam-room",
"two-sum",
"add-two-numbers",
..........................................
"minimum-knight-moves",
"how-many-apples-can-you-put-into-the-basket",

然后就是批量获取了,统一放在temp文件夹里,方便查找。

因为某些作者写的代码过于精简或者代码位置定位不到,有的显示获取问题,有的则会是空文件,所以需要写一个脚本对文件大小进行过滤,只留大文件(建议先阅读代码再进行使用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import os

def delete_small_files(directory, min_size):
"""
检查目录中所有文件的大小,删除小于 min_size 字节的文件,包括子目录中的文件。

:param directory: 要检查的目录路径
:param min_size: 最小文件大小(字节)
"""
# 使用 os.walk() 遍历目录中的所有文件和子目录
for dirpath, dirnames, filenames in os.walk(directory):
for filename in filenames:
file_path = os.path.join(dirpath, filename)

# 检查是否是文件
if os.path.isfile(file_path):
file_size = os.path.getsize(file_path)

# 如果文件大小小于 min_size,则删除文件
if file_size < min_size:
print(f"Deleting file: {file_path} (size: {file_size} bytes)")
os.remove(file_path) # 删除文件
else:
print(f"Keeping file: {file_path} (size: {file_size} bytes)")

if __name__ == "__main__":
directory = "." # 当前目录
min_size = int(input("Enter the minimum file size (in bytes): ")) # 输入最小文件大小

if os.path.isdir(directory):
delete_small_files(directory, min_size)
else:
print(f"The directory {directory} does not exist.")

既然代码清理好了,就可以进行自动化测试了,由于本人的vbs技术实在太菜,python的某些库环境又爆炸了,所以只能再预处理一次,主要目的是把相同题目的题解抽取第一个出来方便之后进行一对多的比较:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import os
import shutil

def copy_and_rename_file_to_parent(subfolder_path):
# 获取子文件夹中的所有文件
files = os.listdir(subfolder_path)

# 过滤掉子目录,只保留文件
files = [f for f in files if os.path.isfile(os.path.join(subfolder_path, f))]

# 如果文件夹内有文件
if files:
# 获取文件夹的名字作为新文件名前缀
folder_name = os.path.basename(subfolder_path)

# 获取文件夹中的第一个文件
first_file = files[0]

# 构建源文件路径和目标文件路径(将文件复制到父目录)
source_file = os.path.join(subfolder_path, first_file)
parent_dir = os.path.dirname(subfolder_path) # 父目录路径
target_file = os.path.join(parent_dir, f"{folder_name}{os.path.splitext(first_file)[1]}") # 重命名时使用文件夹名作为前缀,保留扩展名

# 复制文件到父目录并重命名
shutil.copy(source_file, target_file)

# 删除原文件
try:
os.remove(source_file)
print(f"文件 {first_file} 被复制到父目录并重命名为 {folder_name}{os.path.splitext(first_file)[1]},原文件已删除。")
except Exception as e:
print(f"删除文件 {source_file} 时出错: {e}")
else:
print(f"文件夹 {subfolder_path} 中没有文件!")

def get_all_subfolders(directory):
# 获取当前目录下的所有子文件夹
subfolders = [f for f in os.listdir(directory) if os.path.isdir(os.path.join(directory, f))]
return subfolders

if __name__ == "__main__":
current_directory = os.getcwd() # 获取当前工作目录
subfolders = get_all_subfolders(current_directory)

if subfolders:
for folder in subfolders:
subfolder_path = os.path.join(current_directory, folder)
copy_and_rename_file_to_parent(subfolder_path)
else:
print("当前目录下没有文件夹!")

把第一部分代码跑好之后:

就应该进行vbs测试了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("./code") ' 获取当前目录的code文件夹

Set WshShell = CreateObject("WScript.Shell")

' 激活应用程序(可以替换为实际应用程序)
WshShell.Run "course_design_end2.0.exe"
WScript.Sleep 500 ' 等待应用程序启动
WshShell.SendKeys "no" ' 模拟按键输入
WScript.Sleep 100
WshShell.SendKeys "{ENTER}" ' 模拟按下Enter键

' 创建一个 HTMLFile 对象来访问剪贴板


' 遍历当前目录的所有文件夹
For Each objSubFolder In objFolder.SubFolders
' 获取子文件夹名称
subFolderName = objSubFolder.Name
WScript.Sleep 1000

' 模拟按键输入同名的 .c 文件路径
cFilePath = "./code/" & subFolderName & ".c"

' 检查是否存在同名的 .c 文件
If objFSO.FileExists(cFilePath) Then
' 输入路径进入程序并执行判重
' 遍历该文件夹内的其他文件
For Each objFile In objSubFolder.Files
If LCase(objFSO.GetExtensionName(objFile.Name)) = "c" Then
WshShell.SendKeys cFilePath
WScript.Sleep 100
WshShell.SendKeys "{ENTER}" ' 模拟按下Enter键
WScript.Sleep 200
' 发送子文件夹中的每个 .c 文件路径
WshShell.SendKeys objFile.Path
WScript.Sleep 100
WshShell.SendKeys "{ENTER}" ' 模拟按下Enter键
WScript.Sleep 400
End If
Next
End If
Next
WScript.Sleep 2000

' 通过模拟按键选择文本并复制到剪贴板
WshShell.SendKeys "^a" ' Ctrl + A 选择所有文本
WScript.Sleep 100
WshShell.SendKeys "^c" ' Ctrl + C 复制文本到剪贴板
'Set objHTML = CreateObject("htmlfile")
' 获取剪贴板内容
'strClipboardText = objHTML.ParentWindow.ClipboardData.GetData("Text")

' 创建一个新的文本文件并将剪贴板内容追加到文件末尾
'Set objFile = objFSO.OpenTextFile("zzz_output.txt", 8, True) ' 使用 8 为追加模式
'objFile.WriteLine(strClipboardText) ' 将剪贴板内容写入文件(追加)
'objFile.Close

WScript.Echo "剪贴板内容已追加到文件!"

然后输出的数据放在zzz_output.txt里面,需要进行正则提取,然后又要制excel和图表,所以要使用re, openpyxl, matplotlib,

这里分成了两个程序:正则提取制excel(此处不知道问什么读取文件总是出错,所以选择把内容直接放到代码里,由于内容较多,只截取了一次测试的数据)、excel内容提取做plot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import re
from openpyxl import Workbook

# 使用检测到的编码重新读取文件
#with open("zzz_output.txt", "r",errors="ignore") as f:
# text = f.read()

text=r"""Whether to import external keyword library(It shouldn't be more than 500 words)
yes or no:no

Please enter the two copies of the code to be checked again (if you do not need to check again, please enter exit)
code1:./code/3sum.c
code2:D:\code\design\niubi\code\3sum\code_3sum_10.c
两段代码的相似度为:ovo0.7740ovo
两份代码相似度高,可能存在抄袭行为

"""

# 正则表达式模式
pattern = r"code1:\s*([^\\]+\.c)\s*code2:([^\s]+\\([^\\]+\.c))\s*两段代码的相似度为:ovo(\d+\.\d+)ovo"
#pattern=r".*[\\/](.*?)$"


# 使用 re.findall 来查找所有匹配的内容
matches = re.findall(pattern, text)
print(matches)
# 创建一个新的工作簿
wb = Workbook()

# 获取活动工作表
ws = wb.active
ws.title = "相似度结果"

# 写入表头
ws.append(["序号","Code1", "绝对路径","Code2", "相似度"])
i=1
# 如果找到匹配的内容,将其写入 Excel 表格
if matches:
for match in matches:
code1,path, code2, similarity = match
# 将每一行的内容写入表格
ws.append([str(i),code1, path,code2, similarity])
i=i+1
else:
print("没有找到匹配的内容")

# 保存 Excel 文件
wb.save("similarity_results.xlsx")

print("数据已写入 similarity_results.xlsx")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

import openpyxl
import matplotlib.pyplot as plt
import numpy as np

# 1. 读取 Excel 文件
file_path = 'similarity_results.xlsx' # 请替换为你的文件路径
workbook = openpyxl.load_workbook(file_path)

# 选择表单
sheet = workbook.active # 默认读取第一个表单

# 2. 从 Excel 表格中读取数据
# 假设数据在第三列(x轴)和第四列(y轴)
x_data = []
y_data = []

# 遍历表格中的数据(假设数据从第2行开始,第1行是标题)
for row in sheet.iter_rows(min_row=2, max_col=5, values_only=True):
x_data.append(row[0]) # 第三列数据
try:
# 将 y 数据转换为 float 类型,确保没有无效值
y_data.append(float(row[4])) # 第四列数据
except ValueError:
# 如果转换失败,跳过这行数据
print(f"警告: 跳过无法转换为数字的行: {row[4]}")
continue

# 3. 使用 matplotlib 绘制线型图
plt.plot(x_data, y_data, marker='o') # 绘制线图并添加数据点标记
plt.title('plot') # 标题
plt.xlabel('num') # X轴标签
plt.ylabel('similarity') # Y轴标签
plt.grid(True) # 显示网格

# 4. 自定义刻度(控制刻度间隔)
ticks = np.arange(0.6, 1, step=0.05)
plt.yticks(ticks) # 设置 Y 轴的刻度

# 5. 如果 x_data 很多且文件名很长,可以适当旋转 x 轴标签
plt.xticks(ticks=[0,50,100,150,200,250,300,350,400,450,500])

# 6. 显示图形
plt.show()

CATALOG