Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Autotestplat/celery.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Autotestplat.settings')
django.setup()


app = Celery('Autotestplat')

Expand All @@ -20,6 +20,8 @@
app.conf.enable_utc = True
app.conf.timezone = "Asia/Shanghai"

django.setup()

@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
41 changes: 33 additions & 8 deletions Autotestplat/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,15 +73,19 @@

WSGI_APPLICATION = 'Autotestplat.wsgi.application'


DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'autotestplat',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'test123456'}
'PASSWORD': 'Liuzhichao@123',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}

AUTH_PASSWORD_VALIDATORS = [
Expand All @@ -104,14 +108,14 @@
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
USE_TZ = False


STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "autotest").join("static")
os.path.join(BASE_DIR, "autotest", "static")
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = "/upload/"
MEDIA_ROOT = os.path.join(BASE_DIR,'upload')

Expand All @@ -125,14 +129,35 @@
CUBES_REDIS_TIMEOUT=60*60
NEVER_REDIS_TIMEOUT=365*24*60*60


# 根据 settings.py 配置,项目使用了 3 个 Redis 数据库:
# Redis 缓存(CACHES)
# 地址:redis://127.0.0.1:6379/1
# 用途:Django 缓存后端
# Celery Broker
# 地址:redis://127.0.0.1:6379/0
# 用途:Celery 任务队列消息代理
# Celery 结果后端
# 地址:redis://127.0.0.1:6379/1
# 用途:存储 Celery 任务执行结果
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC=True
CELERY_ENABLE_UTC=False
# BROKER_URL= 'amqp://root:root@127.0.0.1:5672/of1' #rabbitmq
BROKER_URL = 'redis://127.0.0.1:6379/0'
BROKER_TRANSPORT = 'redis'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

# 设置 Celery Beat 自动检测数据库变化的间隔(秒)
# 默认是 5 分钟,设置为 10 秒可以更快生效
# CELERYBEAT_MAX_LOOP_INTERVAL = 10

LOGIN_URL = '/autotest/login/'
LOGIN_REDIRECT_URL = '/autotest/index/'
LOGOUT_REDIRECT_URL = '/autotest/login/'

SESSION_COOKIE_AGE = 3600 # 1 小时(60 * 60 = 3600 秒)
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器后失效
SESSION_SAVE_EVERY_REQUEST = False # 不刷新过期时间(固定窗口)
Binary file modified Redis-x64-3.2.100/dump.rdb
Binary file not shown.
8 changes: 4 additions & 4 deletions autotest/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,23 +216,23 @@ class Meta:
db_table = 'autotestplat_testplan_interface'

class AutotestplatTestplanInterfaceResult(models.Model):
report_id = models.CharField(max_length=20,null=True)
report_id = models.CharField(max_length=50,null=True)
product_id = models.IntegerField(null=True)
product_name = models.CharField(max_length=255, blank=True, null=True)
suit_id = models.IntegerField(null=True)
suit_name = models.CharField(max_length=100, null=True)
suit_interface_id = models.IntegerField(null=True)
interface_name = models.CharField(max_length=200,null=True)
url = models.CharField(max_length=100,null=True)
body = models.CharField(max_length=200,null=True)
url = models.CharField(max_length=500,null=True)
body = models.TextField(null=True, blank=True)
mode = models.CharField(max_length=20,null=True)
assert_keywords_old = models.CharField(max_length=20,null=True)
task_mode = models.CharField(max_length=20,null=True)
response = models.TextField(null=True)
response_time = models.TextField(null=True)
result = models.CharField(max_length=20,null=True)
pass_pers = models.CharField(max_length=20, null=True)
date_time = models.CharField(max_length=20,null=True)
date_time = models.CharField(max_length=50,null=True)

class Meta:
managed = True
Expand Down
142 changes: 84 additions & 58 deletions autotest/static/js/performance.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
setProgressURL = 'apiperformance/progress/'
checkStatusURL = 'apiperformance/status/'


function search_performance_interface() {
Expand Down Expand Up @@ -145,14 +146,14 @@ function search_performance_interface() {
return;
}
else if(num_bf == ''){
alert('请输入并发数')
alert('请输入"并发数"')
return;
}
else if(num_sj == ''){
alert('请输入持续运行时间')
alert('请输入"持续运行时间"')
return;
}

$('.jmeter_status').empty().append('状态:准备执行');
$.ajax({
url: "/autotest/apiperformance/prepare/",
Expand All @@ -163,34 +164,82 @@ function search_performance_interface() {
success: function(result) {
console.log(result);
if(result == 'success'){

$('.jmeter_status').empty().append('<progress id="progressBar" value="0" max=""></progress>')
var progressBar = document.getElementById('progressBar');
var duration = document.getElementById('num_sj').value;
var increment = parseInt(duration) * 60;
var duration = parseInt(document.getElementById('num_sj').value);
var increment = duration * 60;
progressBar.max = increment;
let startTime = new Date();

var intervalId = setInterval(function() {
let now = new Date();
let elapsed = now - startTime;
let seconds = Math.floor(elapsed / 1000);
progressBar.value = seconds % 60;
$.ajax({
url: appURL+setProgressURL,
type: 'POST',
data: JSON.stringify({
progress: progressBar.value,
progress_total: increment,
}),
success: (rst) => {
console.log("success")

// 【关键修改】:启动 JMeter 并立即开始轮询真实状态
$.ajax({
url: "/autotest/apiperformance/start/",
headers:{'X-CSRFToken': '{{ csrf_token }}'},
contentType: 'application/json;charset=utf-8',
type: "POST",
traditional: true,
success: function(result) {
if(result == 'success'){
$('.jmeter_status').empty().append('状态:测试进行中');

// 启动状态轮询
var statusCheckInterval = setInterval(function() {
$.ajax({
url: appURL + checkStatusURL,
type: 'GET',
success: function(statusData) {
if(statusData.running) {
// JMeter 仍在运行,更新进度条
progressBar.value = statusData.progress;

// 更新数据库中的进度
$.ajax({
url: appURL + setProgressURL,
type: 'POST',
data: JSON.stringify({
progress: statusData.progress,
progress_total: increment,
}),
success: (rst) => {
console.log("进度更新成功")
}
});
} else {
// JMeter 已结束
clearInterval(statusCheckInterval);
$('.jmeter_status').empty().append('状态:测试完成');
progressBar.value = increment;

// 更新最终状态
$.ajax({
url: appURL + setProgressURL,
type: 'POST',
data: JSON.stringify({
progress: increment,
progress_total: increment,
}),
success: (rst) => {
console.log("最终状态更新成功")
}
});
}
},
error: function(err) {
console.error("状态检查失败:", err);
clearInterval(statusCheckInterval);
$('.jmeter_status').empty().append('状态:状态检查异常');
}
});
}, 500); // 每2秒轮询一次
}
});
if (progressBar.value === progressBar.max-1) {
clearInterval(intervalId);
}
}, 100);
else {
$('.jmeter_status').empty().append('状态:启动失败');
}
},
fail: function(result) {
debugger
}
});
}
else {
$('.jmeter_status').empty().append('状态:出现异常');
Expand All @@ -201,49 +250,26 @@ function search_performance_interface() {
debugger
}
});

$.ajax({
url: "/autotest/apiperformance/start/",
headers:{'X-CSRFToken': '{{ csrf_token }}'},
contentType: 'application/json;charset=utf-8',
type: "POST",
traditional: true,
success: function(result) {
console.log(result);
if(result == 'success'){
$('.jmeter_status').empty().append('状态:测试完成');
$.ajax({
url: appURL+setProgressURL,
type: 'POST',
data: JSON.stringify({
progress: 0,
progress_total: 1,
}),
success: (rst) => {
console.log("success")
}
});
}
else {
$('.jmeter_status').empty().append('状态:测试失败');
}
},
fail: function(result) {
debugger
}
});
}

function select_login(id1,name1,module1) {
$('#login_panel').append('<a href="javascript:void(0)" id="'+id1+'" name="'+module1+'" class="list-group-item logins" onclick="remove_login_selected(\''+id1+'\')">'+name1+'</a>');

}

function view_test_result() {
window.open('/autotest/apiperformance/report/', '_blank');
}

function select_not_login(id1,name1,module1) {
$('#not_login_panel').append('<a href="javascript:void(0)" id="'+id1+'" name="'+module1+'" class="list-group-item not_logins" onclick="remove_not_login_selected(\''+id1+'\')">'+name1+'</a>');
}

function remove_login_selected(ele) {
var id1 = '#'+ele;
$('#login_panel').find(id1).remove();
}

function remove_not_login_selected(ele) {
var id1 = '#'+ele;
$('#not_login_panel').find(id1).remove();
Expand Down
16 changes: 14 additions & 2 deletions autotest/static/js/webtestcase.js
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,13 @@ function run_webtestcase_bycode(e,tips="运行成功"){
$("#addModal").modal('hide')
}
else{
return alert(rst)
// 解析 JSON 响应
var response = typeof rst === 'string' ? JSON.parse(rst) : rst;
if(response.message) {
alert(response.message);
} else {
alert('运行完成。该用例为:' + (response.web_testcase_code || web_testcase_code));
}
}
},
error: (rst) =>{
Expand All @@ -585,7 +591,13 @@ function run_webtestcase_byproduct(e,tips="运行成功"){
$("#addModal").modal('hide')
}
else{
return alert(rst)
// 解析 JSON 响应
var response = typeof rst === 'string' ? JSON.parse(rst) : rst;
if(response.message) {
alert(response.message);
} else {
alert('运行完成');
}
}
},
error: (rst) =>{
Expand Down
2 changes: 1 addition & 1 deletion autotest/tasks.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
from Autotestplat.celery import app

@app.task(bind=True)
Expand Down
5 changes: 2 additions & 3 deletions autotest/templates/interface_performance.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@

<!Doctype html>
<!Doctype html>
<html xmlns="http://www.w3.org/1999/html">
<!---------------------------------------------------------
Auther::Fin; Version:Autotestplat-V3.0
Expand Down Expand Up @@ -227,7 +226,7 @@
<button type="button" class="btn btn-danger btn-sm disabled" style="border-radius: 0" >操作</button>
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="" onclick="generate_performance_file()">生成Jmeter文件</button>
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="" onclick="start_test_jmeter()">测试开始</button>
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="" onclick=""> <a style="color: white;" target="current" href="/static/output/index.html">查看结果</a></button>
<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="" onclick="view_test_result()">查看结果</button>
<span style="color: blue;font-weight:bold;font-size:13px;margin-left: 5px;" class="jmeter_status"><progress id="progressBar" value="{{ progress }}" max="{{ progress_total }}"></progress></span>
</div>
</div>
Expand Down
Loading