C#压力测试 – 模拟对给定共享资源的多次访问
发布时间:2020-12-15 17:49:54 所属栏目:百科 来源:网络整理
导读:如何在c#单元测试中模拟/压力测试大约100个访问给定共享资源(例如数据库)的用户? 解决方法 假设您正在访问真正的数据库,那么您正处于集成测试的范围内.最简单的方法是从多个线程访问资源.例如: [Test]public void SimpleStressTest(){ bool wasExceptionTh
如何在c#单元测试中模拟/压力测试大约100个访问给定共享资源(例如数据库)的用户?
解决方法
假设您正在访问真正的数据库,那么您正处于集成测试的范围内.最简单的方法是从多个线程访问资源.例如:
[Test] public void SimpleStressTest() { bool wasExceptionThrown = false; var threads = new Thread[100]; for(int i = 0; i < 100; i++) { threads[i] = new Thread(new ThreadStart((Action)(() => { try { AccessDB(); } catch(Exception) { wasExceptionThrown = true; } }))); } for(int i = 0; i < 100; i++) { threads[i].Start(); } for(int i = 0; i < 100; i++) { threads[i].Join(); } Assert.That(wasExceptionThrown,Is.False); } 由于无法控制线程流,因此该测试不具有确定性.例如,如果要确保可以同时打开100个连接,可以在AccessDB()的逻辑中放置一个钩子,这将强制它在关闭与DB的连接之前等待. 例如,而不是以前的线程操作: try { AccessDB(sychObject); } catch(Exception) { wasExceptionThrown = true; } 启动所有线程后,确保在sychObject上等待100个线程,然后释放它并加入线程.通过将CloseConnection()(例如)的逻辑设置为virtual并将该测试写入在CloseConnection()中等待的继承类,可以实现相同的目的.例如: public class DataBase { public void AccessDB() { // Do logic here before closing connection CloseConnection(); } protected virtual void CloseConnection() { // Real Logic to close connection } } public class FakeDataBase : DataBase { ManualResetEvent sychObject; public FakeDataBase(ManualResetEvent sychObject) { this.sychObject = sychObject; } override protected void CloseConnection() { sychObject.WaitOne(); base.CloseConnection(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |