2013-03-09 3 views
1

КонтекстSpecflow как запросить базу данных с помощью Linq

Я относительно новым для .NET и решили использовать BDD в проекте. Для этого я использую Specflow.

Я создал файл функций с использованием формата Gherkin и сгенерированных определений шагов.

Я использую Selenium для вставки информации из таблицы в свой файл свойств на веб-страницу, и я использую MSTest для проверки результатов.

Моего Шаг Определение

[Binding] 
public class RegisterSteps 
{ 
    private IWebDriver ff = new FirefoxDriver(); 
    private string username = ""; 

    [Given(@"you are on the register page")] 
    public void GivenYouAreOnTheRegisterPage() 
    {   
     ff.Navigate().GoToUrl("http://localhost:55475/Register"); 
    } 

    [Given(@"you enter the following information")] 
    public void GivenYouEnterTheFollowingInformation(TechTalk.SpecFlow.Table table) 
    { 
     username = table.Rows[6]["Value"]; 
     for (var i = 0; i < table.RowCount; i++) 
     { 
      var field = table.Rows[i]["Field"]; 
      var value = table.Rows[i]["Value"]; 
      field = "mainContentPlaceHolder_TextBox" + field.Replace(" ", string.Empty); 
      ff.FindElement(By.Id(field)).SendKeys(value); 
     } 
    } 

    [When(@"you click submit")] 
    public void WhenYouClickSubmit() 
    { 
     ff.FindElement(By.Id("mainContentPlaceHolder_Submit")).Click(); 
    } 

    [Then(@"you should see the message ""(.*)""")] 
    public void ThenYouShouldSeeTheMessage(string expectedMessage) 
    { 
     string message = ff.FindElement(By.Id("mainContentPlaceHolder_LabelSuccess")).Text; 
     Assert.AreEqual(message, expectedMessage);   
    } 

    [Then(@"a record should be added to the table")] 
    public void ThenARecordShouldBeAddedToTheTable() 
    { 
     RiskClassesDataContext db = new RiskClassesDataContext(); 
     var query = from ao in db.ActionOwners 
        where ao.username.Equals(username) 
        select ao; 
     Assert.IsNotNull(query.First()); 
    } 
} 

Вопросы

  1. Я надеялся, чтобы иметь возможность использовать Linq в моих определениях шага, чтобы проверить, что записи вставляются в различные таблицы. Вышеупомянутый код бросает NullReferenceException на конструктор RiskClassesDataContext(). Мне удалось создать экземпляры RiskClassesDataContext ранее, поэтому мне интересно, если это потому, что я пытаюсь сделать это из моего проекта Specflow, а не из своего веб-приложения.

  2. Последний вопрос: просто ли вы считаете, что это лучший подход для тестирования моего проекта. Является ли селен с запросами базы данных, чтобы проверить весь мой проект, или мне лучше использовать мок. Или, может быть, оба?

Большое спасибо

+0

Что происходит, когда вы нажимаете кнопку? Почта? Или вызов javascript? –

+0

Привет Крис. Это сообщение, которое происходит. –

+0

Вот еще один вопрос, который может справиться с этим: http: // stackoverflow.com/questions/9022293/whats-the-alternative-to-use-thread-sleep-when-working-with-selenium-in-system –

ответ

1

Короткие ответы

  1. я должен был бы увидеть код для RiskClassesDataContext, чтобы быть уверенным, но да, его, скорее всего, потому что ваш не хватает что-то, как вы подключите к база данных.
  2. Нет ничего плохого в этом подходе, но если его Лучший подход зависит от того, чего вы хотите достичь.

Длинный ответ

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

  • Вы пытаетесь написать несколько тестов, которые помогут вам написать свой код?
  • Вы хотите найти исчерпывающую библиотеку тестов, чтобы доказать, что ваш код верен?
  • Должны ли ваши испытания доказать, что ваше решение работает правильно?

Теперь вы можете сказать себе, что хотите, чтобы все они были, или что они все одинаковые, но на самом деле здесь есть несколько тонких вещей.

  • Если вы хотите, чтобы какие-то тесты только помогли вам написать свой код, то что вам нужно, чтобы остановить вас отбрасывать те тесты после написания кода.
  • Если вы хотите, чтобы ваш код был правильным, тогда вы думаете об модульном тестировании, возможно, не заботитесь о разговоре с базами данных, и да Moq будет очень полезен (доступны другие издевательские библиотеки).
  • Если вы хотите, чтобы ваше решение работало, мы смотрим на приемочные испытания, и вам действительно нужно доказать взаимодействие между вашим кодом и базой данных.

Дело в том, что SpecFlow может использоваться для всех этих вещей.

Если вы пытаетесь сделать BDD должным образом, то на самом деле вы сидите с представителем вашего бизнеса и между вами, вы разработали ряд сценариев для функции, которую вы думаете о внедрении , И, конечно же, вы это сделали, прежде чем думать о своем коде. Именно поэтому мы не блокируем наше мышление до какой-либо одной реализации :-) Теперь вы можете сесть и реализовать свои привязки, чтобы они не сработали.

Но что дальше? Ну, конечно, на данный момент мы хотим написать новый код, и поскольку мы хорошие разработчики, мы используем TDD, чтобы помочь нам. И поскольку мы тестируем единицы измерения, мы используем Mocks, чтобы помочь нам изолировать каждую единицу кода. Это приводит к тому, что наш код развивается, так что после написания некоторых наших модульных тестов наши тесты SpecFlow также проходят.

Это приводит нас к использованию нашей Спецификация на примере тестов в качестве внешнего процесса, который определяет нашу новую функциональность и модульные тесты, являющиеся внутренним циклом, который приводит этот код к успеху. Цикл двойного красно-зеленого рефактора. Кроме того, это означает, что наши тесты SpecFlow больше по объему и могут включать доступ к этой базе данных.

Так что теперь, если мы вернемся к нашим вопросам

  • Вы пытаетесь написать несколько тестов, которые помогут вам написать код?
  • SpecFlow может быть частью этого, но я бы посоветовал использовать TDD, а
  • Хотите придумать обширную библиотеку тестов, чтобы доказать, что ваш код является правильным?
  • Не связывайтесь с SpecFlow, просто использовать NUnit и издевается
  • Если ваши тесты доказывают, что ваше решение работает правильно?
  • Это то, что SpecFlow отлично справляется, и если он нуждается в базе данных, то идти вперед

Попробуйте this article для более подробной информации.

В последнем случае, если вы используете базу данных в своих тестах, вам нужно подумать о том, как изолировать ее для нескольких тестовых прогонов. Посмотрите на using-specflow-for-wpf-in-mvvm, чтобы узнать больше об этом

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