2009-05-06 2 views
1

Я изучаю тесты устройств, которые я написал для службы электронной почты (используя SMTP), и мне интересно, достаточно ли одного теста. Вот отрывок из моей службы электронной почты:Достаточно ли моего теста на единицу?

[PluginFamily("EmailService")] 
public interface IEmailService 
{ 
    Boolean SendEmail(string toAddress, string fromAddress, string bccAddress, string ccAddress, string subject, 
         string body, bool html); 
} 
[Pluggable("EmailService")] 
public class EmailService : IEmailService 
{ 
    private IConfigurationReader _configReader; 
    public EmailService(IConfigurationReader configurationReader) 
    { 
     _configReader = configurationReader; 
    } 
    public bool SendEmail(string toAddress, string fromAddress, string bccAddress, string ccAddress, string subject, string body, bool isHtml) 
    { 
     MailMessage email = new MailMessage(); 

     try 
     { 
      if (_configReader.TestMode) 
      { 
       toAddress = _configReader.TestEmailAddress; 
      } 
     } 

     //send email here 
    } 
} 

Я насмешливо IConfigurationReader (в основном обертка для ConfigurationManager) и установить режим тестирования для истинно для того, чтобы проверить, могу ли я отправить по электронной почте в моем «тестовом режиме» , Так что мое модульное тестирование выглядит следующим образом (это одна из моих модульных тестов по методу У меня есть 100% покрытие кода.):

[Test] 
    public void Validate_Send_Email_In_Test_Mode() 
    { 
     bool result; 
     MockRepository mockRepository = new MockRepository(); 
     var mockConfigReader = mockRepository.StrictMock<IConfigurationReader>(); 


     using (mockRepository.Record()) 
     { 

      SetupResult.For(mockConfigReader.TestMode).Return(true); 
      SetupResult.For(mockConfigReader.TestEmailAddress).Return("[email protected]"); 
      SetupResult.For(mockConfigReader.EmailContentLocation).Return("test"); 
      SetupResult.For(mockConfigReader.SmtpHost).Return("test.mail.com"); 
     } 

     ObjectFactory.InjectStub(typeof(IConfigurationReader), mockConfigReader); 
     emailService = ObjectFactory.GetInstance<IEmailService>(); 

     using (mockRepository.Playback()) 
     { 
      result = emailService.SendEmail("[email protected]", 
                "[email protected]", "", "", 
                "this is a unit test - config in test mode", "body of unit test", true); 

     } 

     Assert.That(result, Is.True); 
     ObjectFactory.ResetDefaults(); 

    } 

достаточно ли этого достаточно для модульного тестирования? Что я могу сделать, чтобы улучшить его?

Я обеспокоен тем, что просто проверка того, что мой метод возвращает true, не является достаточным модульным тестом.

ответ

2

Улучшение вашего code coverage (все типы)

+2

Многие люди скажут, что покрытие кода не является отличным признаком хороших тестов, но, безусловно, это долгий путь, особенно если коэффициент покрытия кода составляет 2%. Если вы новичок в области покрытия кода, доходите до 98% и не беспокойтесь о том, чтобы бросать каждое последнее исключение. Только мои 2 цента. –

+0

Аллен - у меня есть 100% покрытие на почтовом сервисе. Наверное, я смотрю, достаточно ли достаточного моего тестового теста ... –

+1

100% -ый охват функций и прилично высокий охват филиалов должны быть хорошим показателем :) – workmad3

2

Я рекомендую вам также включать отрицательные тесты, которые «успешно», когда различные возможные условия ошибки будут выполнены. Например, введите недопустимый адрес электронной почты и убедитесь, что возвращается правильный код ошибки и/или исключение.

Возможно, вы также захотите создать собственный SMTP-сервер. Хотя я не много искал, я нашел this SMTP server mock site. Я использовал метод, подобный этому для тестирования модуля электронной почты моего проекта Java. Таким образом, вам все равно, находится ли он в «тестовом режиме» или производстве. Единственная разница - это комбинация сервер/порт в вашей конфигурации. Это дает дополнительное преимущество, гарантируя, что вы не просто проверяете «тестовый код».

1

Я бы сказал, что эта часть:

{ 
     if (_configReader.TestMode) 
     { 
      toAddress = _configReader.TestEmailAddress; 
     } 
    } 

Является ли код запах. Вы должны проходить в почтовом адресе и следить за тем, чтобы служба вызывалась с тем, что вы передали в качестве параметра для метода, и используйте макет, чтобы убедиться, что он был отправлен на e-mail api правильно. В других словах, издевайтесь над api электронной почтой, не используйте Mock как тестовый объект сам по себе.

Это может помочь вам поэкспериментировать с этим путем, сначала проверьте, где производственный код записывается только в том случае, если вы можете сделать тест, который оправдывает его запись.

2

Может ли отправка электронной почты не удалась? Если это возможно, у вас есть как минимум два случая для тестирования, и ваш единственный тест недостаточен.

Поскольку у вас есть логическое возвращаемое значение, это подсказывает мне, что вы ожидаете один из двух кодов возврата, поэтому снова вы не проверяете все возможности.

Не говоря уже о том, что при отправке электронной почты возвращаемое значение является наименее важным из результатов функции: отправлено ли электронное письмо?

Смежные вопросы