diff --git a/module/testcase/control.php b/module/testcase/control.php
index bc2d1287ae..4e98c59fb5 100644
--- a/module/testcase/control.php
+++ b/module/testcase/control.php
@@ -192,6 +192,9 @@ class testcase extends control
$this->view->groupBy = $groupBy;
$this->view->groupByList = $groupByList;
$this->view->cases = $groupCases;
+ $this->view->suiteList = $this->loadModel('testsuite')->getSuites($productID);
+ $this->view->suiteID = 0;
+ $this->view->moduleID = 0;
$this->display();
}
@@ -343,6 +346,7 @@ class testcase extends control
{
$paddingCount = $this->config->testcase->defaultSteps - count($steps);
$step = new stdclass();
+ $step->type = 'item';
$step->desc = '';
$step->expect = '';
for($i = 1; $i <= $paddingCount; $i ++) $steps[] = $step;
@@ -596,6 +600,7 @@ class testcase extends control
if(empty($case->steps))
{
$step = new stdclass();
+ $step->type = 'item';
$step->desc = '';
$step->expect = '';
$case->steps[] = $step;
@@ -1103,7 +1108,7 @@ class testcase extends control
$relatedModules = $this->dao->select('id, name')->from(TABLE_MODULE)->where('id')->in($relatedModuleIdList)->fetchPairs();
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
$relatedCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('id')->in($relatedCaseIdList)->fetchPairs();
- $relatedSteps = $this->dao->select('`case`, version, `desc`, expect')->from(TABLE_CASESTEP)->where('`case`')->in(@array_keys($cases))->orderBy('version desc,id')->fetchGroup('case');
+ $relatedSteps = $this->dao->select('parent,`case`,version,type,`desc`,expect')->from(TABLE_CASESTEP)->where('`case`')->in(@array_keys($cases))->orderBy('version desc,id')->fetchGroup('case');
$relatedModules = array('0' => '/') + $relatedModules;
foreach($cases as $case)
@@ -1112,14 +1117,25 @@ class testcase extends control
$case->stepExpect = '';
if(isset($relatedSteps[$case->id]))
{
- $i = 1;
+ $i = $childId = 0;
foreach($relatedSteps[$case->id] as $step)
{
+ $stepId = 0;
+ if($step->type == 'group' or ($step->type == 'item' and $step->parent == 0))
+ {
+ $i++;
+ $childId = 0;
+ $stepId = $i;
+ }
+ else
+ {
+ $stepId = $i . '.' . $childId;
+ }
if($step->version != $case->version) continue;
$sign = (in_array($this->post->fileType, array('html', 'xml'))) ? '
' : "\n";
- $case->stepDesc .= $i . ". " . htmlspecialchars_decode($step->desc) . $sign;
- $case->stepExpect .= $i . ". " . htmlspecialchars_decode($step->expect) . $sign;
- $i ++;
+ $case->stepDesc .= $stepId . ". " . htmlspecialchars_decode($step->desc) . $sign;
+ $case->stepExpect .= $stepId . ". " . htmlspecialchars_decode($step->expect) . $sign;
+ $childId ++;
}
}
@@ -1390,30 +1406,43 @@ class testcase extends control
{
$step = trim($step);
if(empty($step)) continue;
- if(preg_match('/^([0-9]+)([.、]{1})/U', $step, $out))
+ if(preg_match('/^(([0-9]+)\.[0-9]+)([.、]{1})/U', $step, $out))
+ {
+ $num = $out[1];
+ $parent = $out[2];
+ $sign = $out[3];
+ $signbit = $sign == '.' ? 1 : 3;
+ $step = trim(substr($step, strlen($num) + $signbit));
+ if(!empty($step)) $caseStep[$num]['content'] = $step;
+ $caseStep[$num]['type'] = 'item';
+ $caseStep[$parent]['type'] = 'group';
+ }
+ elseif(preg_match('/^([0-9]+)([.、]{1})/U', $step, $out))
{
$num = $out[1];
$sign = $out[2];
$signbit = $sign == '.' ? 1 : 3;
- $step = trim(substr($step, strpos($step, $sign) + $signbit));
- if(!empty($step)) $caseStep[$num] = $step;
+ $step = trim(substr($step, strlen($num) + $signbit));
+ if(!empty($step)) $caseStep[$num]['content'] = $step;
+ $caseStep[$num]['type'] = 'item';
}
elseif(isset($num))
{
- $caseStep[$num] .= "\n" . $step;
+ $caseStep[$num]['content'] .= "\n" . $step;
}
else
{
if($field == 'stepDesc')
{
$num = 1;
- $caseStep[$num] = $step;
+ $caseStep[$num]['content'] = $step;
+ $caseStep[$num]['type'] = 'item';
}
if($field == 'stepExpect' and isset($stepData[$row]['desc']))
{
end($stepData[$row]['desc']);
$num = key($stepData[$row]['desc']);
- $caseStep[$num] = $step;
+ $caseStep[$num]['content'] = $step;
}
}
}
diff --git a/module/testcase/css/common.css b/module/testcase/css/common.css
index f747704ac4..49fce99311 100644
--- a/module/testcase/css/common.css
+++ b/module/testcase/css/common.css
@@ -1,15 +1,15 @@
.table-form > tbody > tr > td .btn-group-vertical > .btn {margin-left: 0!important; padding: 2px 8px}
#steps .step-id {text-align: right}
-#steps .step-child-id {background-color: transparent; border: none; display: none; width: 30px; padding-left: 0; padding-right: 0; text-align: right; padding-right: 8px}
+#steps .step-item-id {background-color: transparent; border: none; display: none; width: 30px; padding-left: 0; padding-right: 0; text-align: right; padding-right: 8px}
#steps .checkbox-inline input[type="checkbox"] {top: -2px}
#steps .btn-group .btn {padding-left: 0; padding-right: 0; min-width: 30px;}
.step-actions {width: 100px;}
#steps .active td {transition: background-color .5s;}
#steps .step-group .step-steps {resize: none; max-height: 30px;}
#steps .step-group .step-expects {display: none;}
-#steps .step-child .step-child-id {display: table-cell; min-width: 40px;}
-#steps .step-child .step-id {color: transparent}
+#steps .step-item .step-item-id {display: table-cell; min-width: 40px;}
+#steps .step-item .step-id {color: transparent}
#steps .step-actions {width: 90px; text-align: center;}
#steps .btn-step-move {cursor: move}
diff --git a/module/testcase/js/common.js b/module/testcase/js/common.js
index 1700bdd404..d144ad21af 100644
--- a/module/testcase/js/common.js
+++ b/module/testcase/js/common.js
@@ -152,7 +152,7 @@ function initSteps(selector)
var stepID;
if(isGroup || !childId)
{
- $step.removeClass('step-child');
+ $step.removeClass('step-item');
stepID = parentId++;
$step.find('.step-id').text(stepID);
if(isGroup) childId = 1;
@@ -160,9 +160,11 @@ function initSteps(selector)
else
{
stepID = (parentId - 1) + '.' + (childId++);
- $step.addClass('step-child').find('.step-child-id').text(stepID);
+ $step.addClass('step-item').find('.step-item-id').text(stepID);
}
- $step.find('.step-id-control').val(stepID);
+ $step.find('[name^="steps["]').attr('name', "steps[" +stepID + ']');
+ $step.find('[name^="stepType["]').attr('name', "stepType[" +stepID + ']');
+ $step.find('[name^="expects["]').attr('name', "expects[" +stepID + ']');
});
};
var initSortable = function()
@@ -210,6 +212,7 @@ function initSteps(selector)
refreshStepsID();
}).on('click', '.btn-step-delete', function()
{
+ if($('tbody#steps tr.step').size() == 1) return false;
$(this).closest('.step').remove();
refreshStepsID();
}).on('change', '.step-type', function()
diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php
index 6673adae56..e092da619d 100644
--- a/module/testcase/lang/zh-cn.php
+++ b/module/testcase/lang/zh-cn.php
@@ -13,6 +13,7 @@ $lang->testcase->id = '用例编号';
$lang->testcase->product = "所属{$lang->productCommon}";
$lang->testcase->module = '所属模块';
$lang->testcase->lib = "所属库";
+$lang->testcase->branch = "分支/平台";
$lang->testcase->moduleAB = '模块';
$lang->testcase->story = '相关需求';
$lang->testcase->title = '用例标题';
diff --git a/module/testcase/model.php b/module/testcase/model.php
index 1c022837fd..b3b24de23a 100644
--- a/module/testcase/model.php
+++ b/module/testcase/model.php
@@ -49,7 +49,7 @@ class testcaseModel extends model
->add('version', 1)
->add('fromBug', $bugID)
->setIF($this->post->story != false, 'storyVersion', $this->loadModel('story')->getVersion((int)$this->post->story))
- ->remove('steps,expects,files,labels')
+ ->remove('steps,expects,files,labels,stepType')
->setDefault('story', 0)
->join('stage', ',')
->get();
@@ -67,15 +67,20 @@ class testcaseModel extends model
{
$caseID = $this->dao->lastInsertID();
$this->loadModel('file')->saveUpload('testcase', $caseID);
+ $parentStepID = 0;
foreach($this->post->steps as $stepID => $stepDesc)
{
if(empty($stepDesc)) continue;
+ $isGroup = isset($_POST['stepType'][$stepID]);
$step = new stdClass();
+ $step->parent = $isGroup ? 0 : $parentStepID;
$step->case = $caseID;
$step->version = 1;
+ $step->type = $isGroup ? 'group' : 'item';
$step->desc = htmlspecialchars($stepDesc);
$step->expect = htmlspecialchars($this->post->expects[$stepID]);
$this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec();
+ if($isGroup) $parentStepID = $this->dao->lastInsertID();
}
return array('status' => 'created', 'id' => $caseID);
}
@@ -510,7 +515,7 @@ class testcaseModel extends model
->setIF($this->post->story != false and $this->post->story != $oldCase->story, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story))
->setDefault('story,branch', 0)
->join('stage', ',')
- ->remove('comment,steps,expects,files,labels')
+ ->remove('comment,steps,expects,files,labels,stepType')
->get();
if($this->isForceReview() and $stepChanged) $case->status = 'wait';
$this->dao->update(TABLE_CASE)->data($case)->autoCheck()->batchCheck($this->config->testcase->edit->requiredFields, 'notempty')->where('id')->eq((int)$caseID)->exec();
@@ -518,15 +523,20 @@ class testcaseModel extends model
{
if($stepChanged)
{
+ $parentStepID = 0;
foreach($this->post->steps as $stepID => $stepDesc)
{
if(empty($stepDesc)) continue;
+ $isGroup = isset($_POST['stepType'][$stepID]);
$step = new stdclass();
+ $step->parent = $isGroup ? 0 : $parentStepID;
$step->case = $caseID;
$step->version = $version;
+ $step->type = $isGroup ? 'group' : 'item';
$step->desc = htmlspecialchars($stepDesc);
$step->expect = htmlspecialchars($this->post->expects[$stepID]);
$this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec();
+ if($isGroup) $parentStepID = $this->dao->lastInsertID();
}
}
@@ -931,13 +941,14 @@ class testcaseModel extends model
$steps = array();
if(isset($_POST['desc'][$key]))
{
- foreach($this->post->desc[$key] as $id => $desc)
+ foreach($data->desc[$key] as $id => $desc)
{
$desc = trim($desc);
if(empty($desc))continue;
$step = new stdclass();
+ $step->type = $data->stepType[$key][$id];
$step->desc = $desc;
- $step->expect = trim($this->post->expect[$key][$id]);
+ $step->expect = trim($data->expect[$key][$id]);
$steps[] = $step;
}
@@ -974,16 +985,21 @@ class testcaseModel extends model
$this->dao->update(TABLE_CASE)->data($caseData)->where('id')->eq($caseID)->autoCheck()->exec();
if($stepChanged)
{
+ $parentStepID = 0;
foreach($steps as $id => $step)
{
$step = (array)$step;
if(empty($step['desc'])) continue;
+ $isGroup = $step['type'] == 'group';
$stepData = new stdclass();
+ $stepData->parent = $isGroup ? 0 : $parentStepID;
$stepData->case = $caseID;
$stepData->version = $version;
+ $stepData->type = $step['type'];
$stepData->desc = htmlspecialchars($step['desc']);
$stepData->expect = htmlspecialchars($step['expect']);
$this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec();
+ if($isGroup) $parentStepID = $this->dao->lastInsertID();
}
}
$oldCase->steps = $this->joinStep($oldStep);
@@ -1004,17 +1020,22 @@ class testcaseModel extends model
if(!dao::isError())
{
- $caseID = $this->dao->lastInsertID();
- foreach($this->post->desc[$key] as $id => $desc)
+ $caseID = $this->dao->lastInsertID();
+ $parentStepID = 0;
+ foreach($data->desc[$key] as $id => $desc)
{
$desc = trim($desc);
if(empty($desc)) continue;
+ $isGroup = $data->stepType[$key][$id] == 'group';
$stepData = new stdclass();
+ $stepData->parent = $isGroup ? 0 : $parentStepID;
$stepData->case = $caseID;
$stepData->version = 1;
+ $stepData->type = $isGroup ? 'group' : 'item';
$stepData->desc = htmlspecialchars($desc);
- $stepData->expect = htmlspecialchars($this->post->expect[$key][$id]);
+ $stepData->expect = htmlspecialchars($data->expect[$key][$id]);
$this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec();
+ if($isGroup) $parentStepID = $this->dao->lastInsertID();
}
$this->action->create('case', $caseID, 'Opened');
}
diff --git a/module/testcase/view/caseheader.html.php b/module/testcase/view/caseheader.html.php
index a291f6bc09..5d95bd624d 100644
--- a/module/testcase/view/caseheader.html.php
+++ b/module/testcase/view/caseheader.html.php
@@ -111,7 +111,7 @@
?>
-
+ moduleName == 'story' and $this->methodName == 'zerocase')) common::printIcon('testcase', 'report', "productID=$productID&browseType=$browseType&branchID=$branch&moduleID=$moduleID"); ?>
| - | + | |
| + | + |
| testcase->stepID;?> | testcase->stepDesc;?> | testcase->stepExpect;?> | -actions;?> | +actions;?> |
|---|---|---|---|---|
| $stepID | "; - echo '' . html::textarea('steps[]', $step->desc, "rows='1' class='form-control'") . ' | '; - echo '' . html::textarea('expects[]', $step->expect, "rows='1' class='form-control'") . ' | '; - echo ""; - echo ""; - echo ""; - echo ""; - echo " | "; - echo '|
| + |
+
+
+
+
+
+
+
+ |
+ + |
+
+
+
+
+
+ |
+ |
| + |
+
+
+ desc, "rows='1' class='form-control autosize step-steps'") ?>
+
+
+
+
+ |
+ expect, "rows='1' class='form-control autosize step-expects'") ?> | +
+
+
+
+
+
+ |
+