У меня были проблемы с отладкой некоторых очень сложных интеграционных тестов в нашем приложении. Тест включает в себя настройку среды, развертывание базы данных и тестируемый код, использует множество запросов к базе данных с помощью NHibernate, Spring.NET (DI, AoP, транзакции, ...), многопоточность и некоторую сетевую активность при взаимодействии с платформой интеграции (включает в себя обращения к нативной платформе). DLL).
У меня есть две системы, в которых я работаю с одной и той же кодовой базой:
Блокнот
- i7 (2 ядра с HT = 4 логических процессора), 4 ГБ ОЗУ, диск 5400 об / мин, Win 7 64 бит
Виртуальная машина (Oracle Virtual Box)
- Хост: i7 (4 ядра с HT = 8 логических процессоров, 12 ГБ ОЗУ, система работает с SSD, виртуальная машина с 7200 об / мин диском, Win 7 64bit)
- Виртуальная машина: назначено 4 ядра, выделено 8 ГБ ОЗУ, Win 2008 R2 Enterprise (64-разрядная версия)
- VPN для сетевого общения
- Никакая другая виртуальная машина не работает на хосте
Теперь, если я запускаю тест без отладки, время выполнения составляет почти те же самые 12-15 с (так что сетевое взаимодействие не должно быть проблемой), но если я запускаю тест с отладкой, это занимает менее 2 минут на ноутбуке, но более 4 минуты на виртуальной машине (мне нужно отладить некоторый код в самом конце теста). Я ожидаю, что виртуальная машина будет работать лучше, чем ноутбук, но она работает более чем в два раза медленнее!
Тестовый код использует базовые классы тестирования NUnit, Spring.NET и запускается из сеанса тестирования VS 2010 Ultimate + Resharper.
Это доказательство концепции кода, поэтому охват модульных тестов был довольно низким. Я написал несколько дополнительных модульных тестов для тестирования как можно большего количества кода отдельно, но все же некоторые части написаны не так, как их было бы легко покрыть модульными тестами.
Примечание: смысл этого доказательства концепции заключается в том, чтобы идентифицировать эти части для дальнейшего рефакторинга, а не для реорганизации кода сейчас.
Что может вызвать разницу в скорости?
Edit:
Когда я писал этот вопрос, я думал о другой причине, не связанной с самим программированием - я поставил отдельный вопрос о SuperUser .