您的位置:首页 > 编程语言 > Java开发

.NET—Spring.NET保持数据现场测试

2016-06-25 19:44 585 查看
.NET—Spring.NET保持数据现场测试

解:

这个版本提供两种方式进行测试:1、破坏现场测试;2、恢复现场测试

Nunit2.5.5与VS2008集成

赵海燕

20160625

关键点,配置文件实现bean注入初始化,AdoTemplate可以直接取数据库数据,前一个实现控制反转,后一个是ADO.NET的封装。

1.1 项目地址:

Svn项目地址:

https://cyberzhaohyVM/svn/SmartCode/Spring.NET保持数据现场测试20160625

1.2 项目结构:



1.3 AccountManager

黄色为启动事务;构造函数时注入。

using System;

using System.Data;

using Spring.Transaction;

using Spring.Transaction.Interceptor;

using Spring.TxQuickStart.Dao;

namespace Spring.TxQuickStart.Services

{

public class AccountManager : IAccountManager

{

private IAccountCreditDao accountCreditDao;
private IAccountDebitDao accountDebitDao;

private float maxTransferAmount = 1000000;

public AccountManager(IAccountCreditDao accountCreditDao, IAccountDebitDao accountDebitDao)
{
this.accountCreditDao = accountCreditDao;
this.accountDebitDao = accountDebitDao;
}

public float MaxTransferAmount
{
get { return maxTransferAmount; }
set { maxTransferAmount = value; }
}

// The following rollback rule will result in commiting of only work done
// by the CreateCreate DAO method.  The exception is still propagated out to the
// calling code.

// [Transaction(NoRollbackFor = new Type[] { typeof(ArithmeticException) })]

[Transaction(TransactionPropagation.Required)]
public void DoTransfer(float creditAmount, float debitAmount)
{
accountCreditDao.CreateCredit(creditAmount);

if (creditAmount > maxTransferAmount || debitAmount > maxTransferAmount)
{
throw new ArithmeticException("see a teller big spender...");
}

accountDebitDao.DebitAccount(debitAmount);
}

}


}

1.4 application-config.xml

黄色为初始化注入

region License

/*

* Copyright ?2002-2005 the original author or authors.

*

* Licensed under the Apache License, Version 2.0 (the “License”);

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

4000
* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an “AS IS” BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

endregion

region Imports

using System;

using System.Collections;

using System.Data;

using NUnit.Framework;

using Spring.Aop.Config;

using Spring.Context;

using Spring.Context.Support;

using Spring.Data.Common;

using Spring.Data.Config;

using Spring.Data.Core;

using Spring.Objects.Factory.Support;

using Spring.Objects.Factory.Xml;

using Spring.Transaction.Config;

using Spring.TxQuickStart.Services;

endregion

namespace Spring.TxQuickStart

{

[TestFixture]

public class AccountManagerTests

{

private AdoTemplate adoTemplateCredit;

private AdoTemplate adoTemplateDebit;

private IAccountManager accountManager;

[SetUp]
public void SetUp()
{
// Configure Spring programmatically
NamespaceParserRegistry.RegisterParser(typeof(DatabaseNamespaceParser));
NamespaceParserRegistry.RegisterParser(typeof(TxNamespaceParser));
NamespaceParserRegistry.RegisterParser(typeof(AopNamespaceParser));
IApplicationContext context = CreateContextFromXml();
IDictionary dict = context.GetObjectsOfType(typeof (IAccountManager));
accountManager = context["accountManager"] as IAccountManager;
CleanDb(context);
}

private static IApplicationContext CreateContextFromXml()
{
return new XmlApplicationContext(
// use for demoing ado tx manager
"assembly://Spring.TxQuickStart.Tests/Spring.TxQuickStart/system-test-local-config.xml"
// use for demoing TransactionScope tx manager


// “assembly://Spring.TxQuickStart.Tests/Spring.TxQuickStart/system-test-dtc-config.xml”

);

}

[Test]
public void TransferBelowMaxAmount()
{
accountManager.DoTransfer(217, 217);

//asserts to read from db...

int numCreditRecords = (int)adoTemplateCredit.ExecuteScalar(CommandType.Text, "select count(*) from Credits");
int numDebitRecords =  (int)adoTemplateDebit.ExecuteScalar(CommandType.Text, "select count(*) from Debits");
Assert.AreEqual(1, numCreditRecords);
Assert.AreEqual(1, numDebitRecords);
}

[Test]
public void TransferAboveMaxAmount()
{
try
{
accountManager.DoTransfer(2000000, 200000);
Assert.Fail("Should have thrown Arithmethic Exception");
} catch (ArithmeticException)
{
int numCreditRecords = (int)adoTemplateCredit.ExecuteScalar(CommandType.Text, "select count(*) from Credits");
int numDebitRecords = (int)adoTemplateDebit.ExecuteScalar(CommandType.Text, "select count(*) from Debits");
Assert.AreEqual(0, numCreditRecords);
Assert.AreEqual(0, numDebitRecords);
}

}

// Run the following test only if you have changed to the alternate implementation
// of the method DoTransfer in AccountManager that specifies the NoRollbackFor property.
[Test]
[Ignore("Change impl of AccountManager as shown before running this test")]
public void TransferAboveMaxAmountNoRollbackFor()
{
try
{
accountManager.DoTransfer(2000000, 2000000);
Assert.Fail("Should have thrown Arithmethic Exception");
} catch (ArithmeticException) {
int numCreditRecords = (int)adoTemplateCredit.ExecuteScalar(CommandType.Text, "select count(*) from Credits");
int numDebitRecords = (int)adoTemplateDebit.ExecuteScalar(CommandType.Text, "select count(*) from Debits");
Assert.AreEqual(1, numCreditRecords);
Assert.AreEqual(0, numDebitRecords);
}
}

private void CleanDb(IApplicationContext context)
{
IDbProvider dbProvider = (IDbProvider)context["DebitDbProvider"];
adoTemplateDebit = new AdoTemplate(dbProvider);
adoTemplateDebit.ExecuteNonQuery(CommandType.Text, "truncate table Debits");

dbProvider = (IDbProvider)context["CreditDbProvider"];
adoTemplateCredit = new AdoTemplate(dbProvider);
adoTemplateCredit.ExecuteNonQuery(CommandType.Text, "truncate table Credits");

}
}


}

1.7 system-test-local-config.xml

黄色代码,整合了被测试类bean文件。

region License

/*

* Copyright ?2002-2005 the original author or authors.

*

* Licensed under the Apache License, Version 2.0 (the “License”);

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an “AS IS” BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

endregion

region Imports

using System;

using System.Collections;

using System.Data;

using NUnit.Framework;

using Spring.Aop.Config;

using Spring.Context;

using Spring.Context.Support;

using Spring.Data.Common;

using Spring.Data.Config;

using Spring.Data.Core;

using Spring.Objects.Factory.Support;

using Spring.Objects.Factory.Xml;

using Spring.Transaction.Config;

using Spring.TxQuickStart.Services;

using Spring.Testing.NUnit;

endregion

namespace Spring.TxQuickStart

{

[TestFixture]

public class AccountManagerTestsTransaction : AbstractTransactionalDbProviderSpringContextTests

{

protected override string[] ConfigLocations

{

get

{

return new String[] { “assembly://Spring.TxQuickStart.Tests/Spring.TxQuickStart/system-test-local-config.xml” };

}

}

private AdoTemplate adoTemplateCredit;

private AdoTemplate adoTemplateDebit;

private IAccountManager accountManager;

[SetUp]
public void SetUp()
{    //没什么用
//this.DefaultRollback = true;
this.DefaultRollback = false;
// Configure Spring programmatically
NamespaceParserRegistry.RegisterParser(typeof(DatabaseNamespaceParser));
NamespaceParserRegistry.RegisterParser(typeof(TxNamespaceParser));
NamespaceParserRegistry.RegisterParser(typeof(AopNamespaceParser));

IDictionary dict  = applicationContext.GetObjectsOfType(typeof(IAccountManager));
accountManager = applicationContext["accountManager"] as IAccountManager;
CleanDb(applicationContext);
}

[Test]
public void TransferBelowMaxAmount()
{
accountManager.DoTransfer(217, 217);

//asserts to read from db...

int numCreditRecords = (int)adoTemplateCredit.ExecuteScalar(CommandType.Text, "select count(*) from Credits");
int numDebitRecords =  (int)adoTemplateDebit.ExecuteScalar(CommandType.Text, "select count(*) from Debits");
Assert.AreEqual(1, numCreditRecords);
Assert.AreEqual(1, numDebitRecords);
}

[Test]
public void TransferAboveMaxAmount()
{
try
{
accountManager.DoTransfer(2000000, 200000);
Assert.Fail("Should have thrown Arithmethic Exception");
} catch (ArithmeticException)
{
int numCreditRecords = (int)adoTemplateCredit.ExecuteScalar(CommandType.Text, "select count(*) from Credits");
int numDebitRecords = (int)adoTemplateDebit.ExecuteScalar(CommandType.Text, "select count(*) from Debits");
Assert.AreEqual(0, numCreditRecords);
Assert.AreEqual(0, numDebitRecords);
}

}

// Run the following test only if you have changed to the alternate implementation
// of the method DoTransfer in AccountManager that specifies the NoRollbackFor property.
[Test]
[Ignore("Change impl of AccountManager as shown before running this test")]
public void TransferAboveMaxAmountNoRollbackFor()
{
try
{
accountManager.DoTransfer(2000000, 2000000);
Assert.Fail("Should have thrown Arithmethic Exception");
} catch (ArithmeticException) {
int numCreditRecords = (int)adoTemplateCredit.ExecuteScalar(CommandType.Text, "select count(*) from Credits");
int numDebitRecords = (int)adoTemplateDebit.ExecuteScalar(CommandType.Text, "select count(*) from Debits");
Assert.AreEqual(1, numCreditRecords);
Assert.AreEqual(0, numDebitRecords);
}
}

private void CleanDb(IApplicationContext context)
{
IDbProvider dbProvider = (IDbProvider)context["DebitDbProvider"];
adoTemplateDebit = new AdoTemplate(dbProvider);
adoTemplateDebit.ExecuteNonQuery(CommandType.Text, "truncate table Debits");

dbProvider = (IDbProvider)context["CreditDbProvider"];
adoTemplateCredit = new AdoTemplate(dbProvider);
adoTemplateCredit.ExecuteNonQuery(CommandType.Text, "truncate table Credits");

}
}


}

1.10 使用nunit2.5.5

在vs2008中集成nunit

\vmware-host\Shared Folders\F\软件安装包\单元测试\ NUnit-2.5.5.10112.msi

在一个类库的项目新建一个类,加入如下代码:

using System;

using System.Collections.Generic;

using System.Text;

namespace Spring

{

class Program

{

static void Main(string[] args)

{

}

}

}

修改项目属性:







在VS2008选中测试项目直接启动,就可以启动nunit



设置好nunit为当前项目exe所在路径,就可以进行断点调试了。



1.11 测试效果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: