Jquery 控制质量测试命令
我已经用jQuery和大量ajax请求(json格式)构建了一个网站。Jquery 控制质量测试命令,jquery,ajax,unit-testing,qunit,Jquery,Ajax,Unit Testing,Qunit,我已经用jQuery和大量ajax请求(json格式)构建了一个网站。 我想做一些单元测试来验证服务器端的请求。 当我使用jQuery时,我使用qUnit,但我有一个测试顺序的问题 例如,我想测试一下: -创建一个用户=>是可能的 -使用有效名称重命名用户=>是可能的 -无法使用旧名称重命名用户=>无法 -删除用户=>是可能的 我的代码: $("button#test").button().click(function() { module("Module Users");
我想做一些单元测试来验证服务器端的请求。
当我使用jQuery时,我使用qUnit,但我有一个测试顺序的问题 例如,我想测试一下: -创建一个用户=>是可能的
-使用有效名称重命名用户=>是可能的
-无法使用旧名称重命名用户=>无法
-删除用户=>是可能的 我的代码:
$("button#test").button().click(function() {
module("Module Users");
newName = 'newUserName';
userId = 0;
test("1 Add a user", function() {
stop();
$.getJSON(Request,{'action':'add','table':'users'}
,function(data) {
equal( data.status,"OK", "Answer is OK" );
notEqual( data.item,null, "item is return" );
userId = data.item.id;
start();
});
});
test("2 Rename user", function() {
stop();
$.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':newName}
,function(data) {
equal( data.status,"OK", "Answer is OK" );
equal( data.value,newName, "Return value is OK" );
start();
});
});
test("3 Rename user with use name", function() {
stop();
badName = 'usedName'; // assert that a user with this name exists
$.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':badName}
,function(data) {
equal( data.status,"Fail", "Answer is Fail" );
equal( data.value,newName, "Return value is previous name" );
start();
});
});
test("4 Remove the user", function() {
stop();
$.getJSON(Request,{'action':'remove','table':'users','id':userId}
,function(data) {
equal( data.status,"OK", "Answer is OK" );
start();
});
});
但问题是1测试运行,然后4、2和3。。。
(那么,我认为问题在于我的测试不是独立的)
如何解决这个问题?我可以在1中级联所有4个测试,但我认为它的可读性会降低
您认为如何?您的示例中的主要问题是测试在click事件处理程序中运行。您需要重构它,并在顶层调用test()(独立于任何单击事件)。因为您的测试本身只测试ajaxy功能,所以根本不需要使用按钮。比如说:
test("1 Add a user", function() {
stop();
$.getJSON(Request,{'action':'add','table':'users'}
,function(data) {
equal( data.status,"OK", "Answer is OK" );
notEqual( data.item,null, "item is return" );
userId = data.item.id;
start();
});
});
test("2 Rename user", function() {
stop();
$.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':newName}
,function(data) {
equal( data.status,"OK", "Answer is OK" );
equal( data.value,newName, "Return value is OK" );
start();
});
});
test("3 Rename user with use name", function() {
stop();
badName = 'usedName'; // assert that a user with this name exists
$.getJSON(Request,{'action':'modify','table':'users','id':userId,'field':'name','value':badName}
,function(data) {
equal( data.status,"Fail", "Answer is Fail" );
equal( data.value,newName, "Return value is previous name" );
start();
});
});
test("4 Remove the user", function() {
stop();
$.getJSON(Request,{'action':'remove','table':'users','id':userId}
,function(data) {
equal( data.status,"OK", "Answer is OK" );
start();
});
});
正如kelloti所说,qUnit是用于单元测试的,并且“单元测试应该是相互独立和隔离的”。。。
然后,我必须在测试删除之前添加一个元素。有时候,您只是想完成这项工作 如果需要,试试看
QUnit.config.reorder=false 单元测试应该是相互独立的。单元测试框架通常以任意顺序执行测试。原因是独立测试更具可读性,更易于维护,测试效果更好。有用于场景测试的jQuery框架吗?不,问题在于qUnit用于单元测试,单元测试应该是独立的……如果其他人的答案是答案,你应该把它标记为答案。凯洛蒂没有回答这个问题,只是评论一下这个问题!我对它的评论投了赞成票,乔恩的回答不好-1集成测试也有价值,通常需要按特定顺序运行。如果你说QUnit是集成测试的错误工具,或者他的基本集成方法有缺陷,那么提供一个可行的替代方案。谢谢。虽然对于大多数测试,您确实希望保持它们的独立性,但如果您希望使用此简单设置创建、修改、删除集成测试,这将是非常棒的!)