From 4bcf882dc1709c1b2b5ee3f9b3b66be4f5bb96d3 Mon Sep 17 00:00:00 2001 From: ava1on Date: Fri, 15 Apr 2016 01:32:23 +0300 Subject: [PATCH 01/21] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B4=D0=B2=D0=B0=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D1=85=20=D1=82=D0=B5=D1=81=D1=82=D0=B0:=20=20-=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D0=B0=20=D0=B2=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B5=20=D0=B2=D0=B8=D0=B4?= =?UTF-8?q?=D0=B6=D0=B5=D1=82=D0=B0=20=20-=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B5=D1=89=D0=B5=20=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D0=B8=D0=B4=D0=B6=D0=B5=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/webtests/WeatherWebTest.java | 14 ++++++++++ .../ru/qatools/school/pages/MainPage.java | 8 ++++++ .../blocks/widgetblocks/PrimaryTitle.java | 27 +++++++++++++++++++ .../blocks/widgetblocks/WidgetTitle.java | 10 +++++++ .../school/steps/websteps/DefaultSteps.java | 14 ++++++++++ 5 files changed, 73 insertions(+) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index a4c5a40..cfded18 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -29,6 +29,20 @@ public void shouldSeeWidgetOnMainPage() { defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); } + @Test + @Title("В заголовке виджета должны видеть город, указанный в ссылке") + public void shouldSeeSelectedCityOnWidgetTitle(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSeeRightCityInWidgetsTitle(MOSCOW); + } + + @Test + @Title("Должны видеть на один виджет больше после нажатия на кнопку +") + public void shouldSeeOneMoreWidget(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSeeNewAddedWidget(onMainPage()); + } + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java index 4d75376..9bfb2e9 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -5,6 +5,7 @@ import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.Button; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -23,8 +24,15 @@ public MainPage(WebDriver driver) { @FindBy(css = ".card.card_md") private List weatherWidget; + @Name("Кнопка для добавления виджетов") + @FindBy(css = ".new-card") + private Button addNewWidgetButton; + public List getWeatherWidget() { return weatherWidget; } + public Button getAddNewWidgetButton(){ + return addNewWidgetButton; + } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java new file mode 100644 index 0000000..2571337 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java @@ -0,0 +1,27 @@ +package ru.qatools.school.pages.blocks.widgetblocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by sergey.petrov on 15.04.2016. + */ +public class PrimaryTitle extends HtmlElement{ + + @Name("Название города") + @FindBy(css = ".inplace") + private WebElement city; + + public String getCityName(){ + return city.getText(); + } + + public Rectangle getRect(){ + return null; + } + + +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java index 8a88782..9a2c075 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -1,6 +1,8 @@ package ru.qatools.school.pages.blocks.widgetblocks; import org.openqa.selenium.Rectangle; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; /** @@ -8,6 +10,14 @@ */ public class WidgetTitle extends HtmlElement { + @Name("Город") + @FindBy(css = ".card-title__primary") + private PrimaryTitle primaryTitle; + + public PrimaryTitle getPrimaryTitle(){ + return primaryTitle; + } + public Rectangle getRect() { return null; } diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 1425a42..b8a8f66 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -6,6 +6,7 @@ import ru.yandex.qatools.allure.annotations.Step; import static java.lang.String.format; +import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -32,6 +33,19 @@ public void shouldSee(WebElement element) { assertThat("Должны видеть элемент", element, isDisplayed()); } + @Step("Должны видеть в заголовке город, указанный в ссылке") + public void shouldSeeRightCityInWidgetsTitle(String cityName){ + assertThat("Город в заголовке совпадает с указанным в ссылке", + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getPrimaryTitle().getCityName() , is(cityName)); + } + + @Step("Должны видеть на один виджет больше после добавления") + public void shouldSeeNewAddedWidget(MainPage page){ + int numberOfWidgets = page.getWeatherWidget().size(); + page.getAddNewWidgetButton().click(); + assertThat("Должны видеть на один виджет больше", page.getWeatherWidget().size(), is(numberOfWidgets+1)); + } + private MainPage onMainPage() { return new MainPage(driver); } From 74e6e75a8b86263469d09fca5f651d6c22e088e7 Mon Sep 17 00:00:00 2001 From: ava1on Date: Tue, 19 Apr 2016 00:18:07 +0300 Subject: [PATCH 02/21] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8=20=D1=81?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D1=8F=D0=BC=D0=B8:=20-=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=B1=D0=BB=D0=BE=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B2=D0=B8=D0=B4?= =?UTF-8?q?=D0=B6=D0=B5=D1=82=D0=B0,=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=20=D1=8D=D1=82=D0=BE=D0=B3=D0=BE=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=20=20?= =?UTF-8?q?WebElement=20-=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=88?= =?UTF-8?q?=D0=B0=D0=B3=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B0=D0=B6=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=8F=20=D0=BD=D0=B0=20=D0=BA=D0=BD=D0=BE=D0=BF?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=D0=B8=D0=B4=D0=B6=D0=B5=D1=82=D0=B0=20-?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B8=D0=B4?= =?UTF-8?q?=D0=B6=D0=B5=D1=82=D0=B0=20-=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D1=8B=D1=85=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=D0=B8=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/webtests/WeatherWebTest.java | 10 ++++--- .../blocks/widgetblocks/PrimaryTitle.java | 27 ------------------- .../blocks/widgetblocks/WidgetTitle.java | 5 ++-- .../school/steps/websteps/DefaultSteps.java | 20 ++++++++------ 4 files changed, 21 insertions(+), 41 deletions(-) delete mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index cfded18..61c322b 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -30,17 +30,19 @@ public void shouldSeeWidgetOnMainPage() { } @Test - @Title("В заголовке виджета должны видеть город, указанный в ссылке") - public void shouldSeeSelectedCityOnWidgetTitle(){ + @Title("В заголовке виджета должны видеть город, указанный в запросе") + public void shouldSeeSelectedCityOnWidgetTitle() { defaultSteps.openMainPageWithCity(MOSCOW); defaultSteps.shouldSeeRightCityInWidgetsTitle(MOSCOW); } @Test @Title("Должны видеть на один виджет больше после нажатия на кнопку +") - public void shouldSeeOneMoreWidget(){ + public void shouldSeeOneMoreWidget() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSeeNewAddedWidget(onMainPage()); + int numberOfWidgets = onMainPage().getWeatherWidget().size(); + defaultSteps.addNewWidgetOnMainPage(); + defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets+1); } private MainPage onMainPage() { diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java deleted file mode 100644 index 2571337..0000000 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/PrimaryTitle.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.qatools.school.pages.blocks.widgetblocks; - -import org.openqa.selenium.Rectangle; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.FindBy; -import ru.yandex.qatools.htmlelements.annotations.Name; -import ru.yandex.qatools.htmlelements.element.HtmlElement; - -/** - * Created by sergey.petrov on 15.04.2016. - */ -public class PrimaryTitle extends HtmlElement{ - - @Name("Название города") - @FindBy(css = ".inplace") - private WebElement city; - - public String getCityName(){ - return city.getText(); - } - - public Rectangle getRect(){ - return null; - } - - -} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java index 9a2c075..0d3f105 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -1,6 +1,7 @@ package ru.qatools.school.pages.blocks.widgetblocks; import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; @@ -12,9 +13,9 @@ public class WidgetTitle extends HtmlElement { @Name("Город") @FindBy(css = ".card-title__primary") - private PrimaryTitle primaryTitle; + private WebElement primaryTitle; - public PrimaryTitle getPrimaryTitle(){ + public WebElement getPrimaryTitle(){ return primaryTitle; } diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index b8a8f66..0cd62e8 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -8,6 +8,7 @@ import static java.lang.String.format; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; /** @@ -33,17 +34,20 @@ public void shouldSee(WebElement element) { assertThat("Должны видеть элемент", element, isDisplayed()); } - @Step("Должны видеть в заголовке город, указанный в ссылке") + @Step("Должны видеть в заголовке виджета текст: {0}") public void shouldSeeRightCityInWidgetsTitle(String cityName){ - assertThat("Город в заголовке совпадает с указанным в ссылке", - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getPrimaryTitle().getCityName() , is(cityName)); + assertThat("Должны видеть текст", + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getPrimaryTitle(), hasText(cityName)); } - @Step("Должны видеть на один виджет больше после добавления") - public void shouldSeeNewAddedWidget(MainPage page){ - int numberOfWidgets = page.getWeatherWidget().size(); - page.getAddNewWidgetButton().click(); - assertThat("Должны видеть на один виджет больше", page.getWeatherWidget().size(), is(numberOfWidgets+1)); + @Step("Нажимаем на кнопку добавления виджета") + public void addNewWidgetOnMainPage(){ + onMainPage().getAddNewWidgetButton().click(); + } + + @Step("Число виджетов на странице должно быть равно: {0}") + public void shouldHaveWidgetNumberOnMainPage(int numberOfWidgets){ + assertThat("Должны видеть виджетов", onMainPage().getWeatherWidget().size(), is(numberOfWidgets)); } private MainPage onMainPage() { From eeff14535aa0506977c1d8bf8b8f4f8e80f5c596 Mon Sep 17 00:00:00 2001 From: ava1on Date: Sat, 23 Apr 2016 01:52:02 +0300 Subject: [PATCH 03/21] Refactored all WebElement types to HtmlElements --- .../java/ru/qatools/school/pages/blocks/WeatherWidget.java | 5 ++--- .../qatools/school/pages/blocks/widgetblocks/WidgetText.java | 5 ++--- .../school/pages/blocks/widgetblocks/WidgetTitle.java | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java index 3990d85..c389206 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -1,7 +1,6 @@ package ru.qatools.school.pages.blocks; import org.openqa.selenium.Rectangle; -import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; @@ -23,7 +22,7 @@ public class WeatherWidget extends HtmlElement { @Name("Панель управления виджетом") @FindBy(css = ".card-actions") - private WebElement actions; + private HtmlElement actions; public WidgetText getWidgetText() { return widgetText; @@ -33,7 +32,7 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { + public HtmlElement getActions() { return actions; } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java index 510d070..b96254b 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java @@ -1,7 +1,6 @@ package ru.qatools.school.pages.blocks.widgetblocks; import org.openqa.selenium.Rectangle; -import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; @@ -13,9 +12,9 @@ public class WidgetText extends HtmlElement { @Name("Картинка текущей погоды") @FindBy(css = ".weather-image") - private WebElement weatherImage; + private HtmlElement weatherImage; - public WebElement getWeatherImage() { + public HtmlElement getWeatherImage() { return weatherImage; } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java index 0d3f105..d911066 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -1,7 +1,6 @@ package ru.qatools.school.pages.blocks.widgetblocks; import org.openqa.selenium.Rectangle; -import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; @@ -13,9 +12,9 @@ public class WidgetTitle extends HtmlElement { @Name("Город") @FindBy(css = ".card-title__primary") - private WebElement primaryTitle; + private HtmlElement primaryTitle; - public WebElement getPrimaryTitle(){ + public HtmlElement getPrimaryTitle(){ return primaryTitle; } From 029201ac20dee1df659e1a1669d5bf2469deaf56 Mon Sep 17 00:00:00 2001 From: ava1on Date: Sun, 24 Apr 2016 20:46:15 +0300 Subject: [PATCH 04/21] Adding additional items to Page Object structure --- .../school/pages/blocks/WeatherWidget.java | 8 +++++ .../pages/blocks/widgetblocks/WidgetText.java | 18 ++++++++++ .../blocks/widgetblocks/WidgetTitle.java | 36 ++++++++++++++++--- .../school/steps/websteps/DefaultSteps.java | 2 +- 4 files changed, 58 insertions(+), 6 deletions(-) diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java index c389206..1186a3e 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -24,6 +24,10 @@ public class WeatherWidget extends HtmlElement { @FindBy(css = ".card-actions") private HtmlElement actions; + @Name("Кнопка удаления виджета") + @FindBy(css = ".remove-card") + private HtmlElement removeWidgetButton; + public WidgetText getWidgetText() { return widgetText; } @@ -36,6 +40,10 @@ public HtmlElement getActions() { return actions; } + public HtmlElement getRemoveWidgetButton() { + return removeWidgetButton; + } + public Rectangle getRect() { return null; } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java index b96254b..8c27260 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java @@ -5,6 +5,8 @@ import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + /** * Created by kurau. */ @@ -14,10 +16,26 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private HtmlElement weatherImage; + @Name("Температура") + @FindBy(css = ".weather-temperature md-12") + private HtmlElement temperature; + + @Name("Погодные данные") + @FindBy(css = ".line.info-line") + private List weatherData; + public HtmlElement getWeatherImage() { return weatherImage; } + public HtmlElement getTemperature() { + return temperature; + } + + public List getWeatherData() { + return weatherData; + } + public Rectangle getRect() { return null; } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java index d911066..15b5857 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -5,17 +5,43 @@ import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + /** * Created by kurau. */ public class WidgetTitle extends HtmlElement { - @Name("Город") - @FindBy(css = ".card-title__primary") - private HtmlElement primaryTitle; + @Name("Название город") + @FindBy(css = ".inplace inplace_displayed") + private HtmlElement cityName; + + @Name("Редактируемое поле города") + @FindBy(css = ".inplace inplace_editable") + private HtmlElement cityNameEditable; + + @Name("Время") + @FindBy(css = ".card-title__secondary") + private HtmlElement currentTime; + + @Name("Список автозаполнения") + @FindBy(css = ".city__name") + private List sugesstedCities; + + public HtmlElement getCityName(){ + return cityName; + } + + public HtmlElement getCityNameEditable() { + return cityNameEditable; + } + + public HtmlElement getCurrentTime() { + return currentTime; + } - public HtmlElement getPrimaryTitle(){ - return primaryTitle; + public List getSugesstedCities() { + return sugesstedCities; } public Rectangle getRect() { diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 0cd62e8..80b342f 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -37,7 +37,7 @@ public void shouldSee(WebElement element) { @Step("Должны видеть в заголовке виджета текст: {0}") public void shouldSeeRightCityInWidgetsTitle(String cityName){ assertThat("Должны видеть текст", - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getPrimaryTitle(), hasText(cityName)); + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityName(), hasText(cityName)); } @Step("Нажимаем на кнопку добавления виджета") From a18b6a3e02344e62335accb0ada9eca164c4c334 Mon Sep 17 00:00:00 2001 From: ava1on Date: Sun, 24 Apr 2016 22:11:05 +0300 Subject: [PATCH 05/21] Arranging smoke test pack: marking existing tests and adding new tests --- .../school/webtests/WeatherWebTest.java | 30 +++++++++++++++++-- .../ru/qatools/school/pages/MainPage.java | 7 +++-- .../blocks/widgetblocks/WidgetTitle.java | 4 +-- .../school/steps/websteps/DefaultSteps.java | 19 ++++++++---- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index 61c322b..c258ccb 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -1,11 +1,13 @@ package ru.qatools.school.webtests; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import ru.qatools.school.pages.MainPage; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.qatools.school.tp.TPInformerRule; import ru.yandex.qatools.allure.annotations.Title; public class WeatherWebTest { @@ -17,12 +19,24 @@ public class WeatherWebTest { @Rule public WebDriverRule webDriverRule = new WebDriverRule(); + @Rule + public TPInformerRule tms = new TPInformerRule("ava1on"); + @Before public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("6") + public void shouldSeeOnlyAddWidgetButton(){ + defaultSteps.openMainPageWithoutParameters(); + defaultSteps.shouldSee(onMainPage().getAddNewWidgetButton()); + defaultSteps.shouldHaveWidgetNumberOnMainPage(0); + } + + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("2") @Title("Должны видеть виджет на главной странице") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); @@ -30,6 +44,7 @@ public void shouldSeeWidgetOnMainPage() { } @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("8") @Title("В заголовке виджета должны видеть город, указанный в запросе") public void shouldSeeSelectedCityOnWidgetTitle() { defaultSteps.openMainPageWithCity(MOSCOW); @@ -37,14 +52,25 @@ public void shouldSeeSelectedCityOnWidgetTitle() { } @Test - @Title("Должны видеть на один виджет больше после нажатия на кнопку +") + @ru.yandex.qatools.allure.annotations.TestCaseId("3") + @Title("Должны видеть на один виджет больше после нажатия на кнопку [+]") public void shouldSeeOneMoreWidget() { defaultSteps.openMainPageWithCity(MOSCOW); int numberOfWidgets = onMainPage().getWeatherWidget().size(); - defaultSteps.addNewWidgetOnMainPage(); + defaultSteps.clickOn(onMainPage().getAddNewWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets+1); } + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("5") + @Title("Должны видеть на один виджет меньше после нажатия на кнопку [-]") + public void shouldSeeLessWidgets(){ + defaultSteps.openMainPageWithCity(MOSCOW); + int numberOfWidgets = onMainPage().getWeatherWidget().size(); + defaultSteps.clickOn(onMainPage().getWeatherWidget().get(0).getRemoveWidgetButton()); + defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets-1); + } + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java index 9bfb2e9..0f53a3f 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -6,6 +6,7 @@ import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.Button; +import ru.yandex.qatools.htmlelements.element.HtmlElement; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -24,15 +25,15 @@ public MainPage(WebDriver driver) { @FindBy(css = ".card.card_md") private List weatherWidget; - @Name("Кнопка для добавления виджетов") + @Name("Кнопка добавления виджетов") @FindBy(css = ".new-card") - private Button addNewWidgetButton; + private HtmlElement addNewWidgetButton; public List getWeatherWidget() { return weatherWidget; } - public Button getAddNewWidgetButton(){ + public HtmlElement getAddNewWidgetButton(){ return addNewWidgetButton; } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java index 15b5857..fb2fc97 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -13,11 +13,11 @@ public class WidgetTitle extends HtmlElement { @Name("Название город") - @FindBy(css = ".inplace inplace_displayed") + @FindBy(css = ".inplace.inplace_displayed") private HtmlElement cityName; @Name("Редактируемое поле города") - @FindBy(css = ".inplace inplace_editable") + @FindBy(css = ".inplace.inplace_editable") private HtmlElement cityNameEditable; @Name("Время") diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 80b342f..d582921 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -4,6 +4,7 @@ import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; import ru.yandex.qatools.allure.annotations.Step; +import ru.yandex.qatools.htmlelements.element.HtmlElement; import static java.lang.String.format; import static org.hamcrest.core.Is.is; @@ -17,6 +18,7 @@ public class DefaultSteps { public static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + public static final String MAIN_PAGE_WITHOUT_PARAMETERS = "http://weather.lanwen.ru"; private WebDriver driver; @@ -29,20 +31,25 @@ public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } + @Step("Открываем главную страницу приложения") + public void openMainPageWithoutParameters(){ + driver.get(MAIN_PAGE_WITHOUT_PARAMETERS); + } + @Step("Должны видеть на странице «{0}»") - public void shouldSee(WebElement element) { + public void shouldSee(HtmlElement element) { assertThat("Должны видеть элемент", element, isDisplayed()); } @Step("Должны видеть в заголовке виджета текст: {0}") - public void shouldSeeRightCityInWidgetsTitle(String cityName){ + public void shouldSeeRightCityInWidgetsTitle(String city){ assertThat("Должны видеть текст", - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityName(), hasText(cityName)); + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityName(), hasText(city)); } - @Step("Нажимаем на кнопку добавления виджета") - public void addNewWidgetOnMainPage(){ - onMainPage().getAddNewWidgetButton().click(); + @Step("Кликаем на {0} ") + public void clickOn(HtmlElement element){ + element.click(); } @Step("Число виджетов на странице должно быть равно: {0}") From 8086dd208d50680f4921550b1c3ff256d75b9ee3 Mon Sep 17 00:00:00 2001 From: ava1on Date: Tue, 26 Apr 2016 18:46:32 +0300 Subject: [PATCH 06/21] Adding Regression tests --- .../school/webtests/WeatherWebTest.java | 120 +++++++++++++++++- pom.xml | 6 + .../ru/qatools/school/data/DataPatterns.java | 31 +++++ .../ru/qatools/school/pages/MainPage.java | 1 - .../ru/qatools/school/pages/PageMethods.java | 92 ++++++++++++++ .../pages/blocks/widgetblocks/WidgetText.java | 2 +- .../blocks/widgetblocks/WidgetTitle.java | 12 +- .../qatools/school/rules/WebDriverRule.java | 3 + .../school/steps/websteps/DefaultSteps.java | 61 ++++++++- 9 files changed, 314 insertions(+), 14 deletions(-) create mode 100644 steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index c258ccb..7c25af5 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -1,20 +1,51 @@ package ru.qatools.school.webtests; +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.data.DataPatterns; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.PageMethods; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.qatools.school.tp.TPInformerRule; import ru.yandex.qatools.allure.annotations.Title; +@RunWith(DataProviderRunner.class) public class WeatherWebTest { public static final String MOSCOW = "Moscow"; + public static final String SPB = "Saint Petersburg"; + public static final String PART_OF_CITYNAME = "Saint P"; + public static final String PAGE_TITLE = "Weather"; + public static final String NEW_WIDGET = "What a city?"; + + @DataProvider + public static Object[][] weatherDataFormat() { + return new Object[][]{ + {0, DataPatterns.SUNRISE}, + {1, DataPatterns.SUNSET}, + {2, DataPatterns.WIND}, + {3, DataPatterns.HUMIDITY} + }; + } + + @DataProvider + public static Object[][] temperatureFormat(){ + return new Object[][]{ + {0, DataPatterns.CELSIUS}, + {1, DataPatterns.KELVIN}, + {2, DataPatterns.FAHRENHEIT}, + {3, DataPatterns.KAIF} + }; + } private DefaultSteps defaultSteps; + private PageMethods pageMethods; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); @@ -25,10 +56,12 @@ public class WeatherWebTest { @Before public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + pageMethods = new PageMethods(webDriverRule.getDriver()); } @Test @ru.yandex.qatools.allure.annotations.TestCaseId("6") + @Title("Должны видеть только кнопку [+] ") public void shouldSeeOnlyAddWidgetButton(){ defaultSteps.openMainPageWithoutParameters(); defaultSteps.shouldSee(onMainPage().getAddNewWidgetButton()); @@ -51,13 +84,21 @@ public void shouldSeeSelectedCityOnWidgetTitle() { defaultSteps.shouldSeeRightCityInWidgetsTitle(MOSCOW); } + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("16") + @Title("Должны видеть новый виджет при открытии страницы без параметров") + public void shouldSeeNewWidgetOnMainPageWithoutParameters() { + defaultSteps.openMainPageWithCity(""); + defaultSteps.shouldSeeRightCityInWidgetsTitle(NEW_WIDGET); + } + @Test @ru.yandex.qatools.allure.annotations.TestCaseId("3") @Title("Должны видеть на один виджет больше после нажатия на кнопку [+]") public void shouldSeeOneMoreWidget() { defaultSteps.openMainPageWithCity(MOSCOW); int numberOfWidgets = onMainPage().getWeatherWidget().size(); - defaultSteps.clickOn(onMainPage().getAddNewWidgetButton()); + pageMethods.clickOn(onMainPage().getAddNewWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets+1); } @@ -67,12 +108,83 @@ public void shouldSeeOneMoreWidget() { public void shouldSeeLessWidgets(){ defaultSteps.openMainPageWithCity(MOSCOW); int numberOfWidgets = onMainPage().getWeatherWidget().size(); - defaultSteps.clickOn(onMainPage().getWeatherWidget().get(0).getRemoveWidgetButton()); + pageMethods.clickOn(onMainPage().getWeatherWidget().get(0).getRemoveWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets-1); } + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("9") + @Title("Должны видеть время и дату в установленном в системе формате") + public void shouldSeeDateAndTime(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSeeDateEqualToSystemDate(); + } + + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("11") + @Title("Должны видеть новое название города после изменения") + public void shouldSeeNewCityAfterChangeUsingEnterKey(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.changeWidgetTitle(MOSCOW,SPB); + defaultSteps.shouldSeeRightCityInWidgetsTitle(SPB); + } + + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("12") + @Title("Должны видеть список автозаполнения") + public void shouldSeeSuggestCitiesList(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.suggestList(PART_OF_CITYNAME); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getSuggestedCitiesList()); + } + + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("13") + @Title("В списке автозаполнения должны отображаться только подходящие введенному значению города") + public void shouldSeeSuitableSuggestedCities(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.suggestList(PART_OF_CITYNAME); + defaultSteps.suggestedCitiesListItems(PART_OF_CITYNAME); + } + + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("14") + @Title("Должны изменить город используя список автозаполения") + public void shouldSeeNewCityAfterChangeUsingSuggestedList(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.suggestList(PART_OF_CITYNAME); + pageMethods.selectElementFromSuggestedList(SPB); + defaultSteps.shouldSeeRightCityInWidgetsTitle(SPB); + } + + @Test + @UseDataProvider("temperatureFormat") + @ru.yandex.qatools.allure.annotations.TestCaseId("4") + @Title("Погодные данные должны отображаться в правильном формате") + public void shouldSeeTemperatureInCorrectFormat(int id, DataPatterns pattern) { + defaultSteps.openMainPageWithCity(MOSCOW); + pageMethods.clickOnSeveralTimes(onMainPage().getWeatherWidget().get(0).getWidgetText().getTemperature(), id); + defaultSteps.shouldSeeMatchingValueForTemperature(pattern.toString()); + } + + @Test + @UseDataProvider("weatherDataFormat") + @ru.yandex.qatools.allure.annotations.TestCaseId("7") + @Title("Погодные данные должны отображаться в правильном формате") + public void shouldSeeWeatherDataInCorrectFormat(int id, DataPatterns pattern) { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSeeMatchingValueForWeatherData(id, pattern.toString()); + } + + @Test + @ru.yandex.qatools.allure.annotations.TestCaseId("10") + @Title("Должеы видеть правильны заголовок страницы") + public void shouldSeePageTitle(){ + defaultSteps.openMainPageWithoutParameters(); + defaultSteps.shouldSeeTitle(PAGE_TITLE); + } + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } - } diff --git a/pom.xml b/pom.xml index a32202a..95e6793 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,12 @@ junit 4.12 + + com.tngtech.java + junit-dataprovider + 1.10.4 + test + diff --git a/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java b/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java new file mode 100644 index 0000000..d53866a --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java @@ -0,0 +1,31 @@ +package ru.qatools.school.data; + +/** + * Created by sergey.petrov on 25.04.2016. + */ +public enum DataPatterns { + CELSIUS("^-?\\d{1,2}\\.\\d °C$"), + KELVIN("^[1-3]\\d{2}\\.\\d °K$"), + FAHRENHEIT("^-?[1]?\\d{1,2}\\.\\d °F$"), + KAIF("^-?\\d{1,2}\\.\\d °Kaif$"), + SUNRISE("^Sunrise\\s[0-2][0-9]:[0-5][0-9]$"), + SUNSET("^Sunset\\s[0-2][0-9]:[0-5][0-9]$"), + WIND("^Wind\\s\\d{1,} m\\/s$"), + HUMIDITY("^Humidity\\s[0-9]{1,} %$"); + + private final String pattern; + + DataPatterns(String pattern) { + this.pattern = pattern; + } + + public String getPattern(){ + return pattern.toString(); + } + + @Override + public String toString(){ + return pattern; + } + +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java index 0f53a3f..ba19c4f 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -5,7 +5,6 @@ import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.htmlelements.annotations.Name; -import ru.yandex.qatools.htmlelements.element.Button; import ru.yandex.qatools.htmlelements.element.HtmlElement; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; diff --git a/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java b/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java new file mode 100644 index 0000000..d0643a6 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java @@ -0,0 +1,92 @@ +package ru.qatools.school.pages; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeDiagnosingMatcher; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import ru.qatools.school.pages.blocks.WeatherWidget; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.regex.Pattern; + +/** + * Created by ava1on + */ +public class PageMethods { + + private MainPage mainPage; + private WebDriverWait webDriverWait; + + public PageMethods(WebDriver driver){ + mainPage = new MainPage(driver); + webDriverWait = new WebDriverWait(driver, 5); + } + + public void clickOn(HtmlElement element){ + element.click(); + } + + public void clickOnSeveralTimes(HtmlElement element, int times){ + while(times-- > 0) + element.click(); + } + + public void enterText(String text, HtmlElement field){ + field.clear(); + field.sendKeys(text); + field.sendKeys(Keys.ENTER); + } + + public String getCurrentDate(){ + SimpleDateFormat sdf = new SimpleDateFormat("h a, dd MMM yy (XXX)", Locale.ENGLISH); + return sdf.format(new Date()); + } + + public void selectElementFromSuggestedList(String city){ + HtmlElement element = findElementByName(city, mainPage.getWeatherWidget().get(0).getWidgetTitle().getSugesstedCities()); + clickOn(element); + webDriverWait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(mainPage.getWeatherWidget().get(0)))); + } + + public WeatherWidget findWidgetByName(String city){ + List widgets=mainPage.getWeatherWidget(); + for (WeatherWidget element : widgets){ + if (element.getWidgetTitle().getCityName().getText().equals(city)) + return element; + } + return null; + } + + public HtmlElement findElementByName(String item, List list){ + for(HtmlElement elem : list) + if(elem.getText().equals(item)) + return elem; + return null; + } + + public Matcher regexMatcher(String part){ + return new TypeSafeDiagnosingMatcher() { + @Override + protected boolean matchesSafely(HtmlElement element, Description description) { + Pattern pattern = Pattern.compile(".*"+part+".*"); + java.util.regex.Matcher matcher = pattern.matcher(element.getText()); + if (matcher.matches()) + return true; + description.appendText("was ").appendValue(element.getText()); + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("Название города должно содержать строку ").appendValue(part); + } + }; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java index 8c27260..1207171 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java @@ -17,7 +17,7 @@ public class WidgetText extends HtmlElement { private HtmlElement weatherImage; @Name("Температура") - @FindBy(css = ".weather-temperature md-12") + @FindBy(css = ".weather-temperature.md-12") private HtmlElement temperature; @Name("Погодные данные") diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java index fb2fc97..18188e4 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -12,7 +12,7 @@ */ public class WidgetTitle extends HtmlElement { - @Name("Название город") + @Name("Название города") @FindBy(css = ".inplace.inplace_displayed") private HtmlElement cityName; @@ -20,11 +20,15 @@ public class WidgetTitle extends HtmlElement { @FindBy(css = ".inplace.inplace_editable") private HtmlElement cityNameEditable; - @Name("Время") + @Name("Время и дата") @FindBy(css = ".card-title__secondary") private HtmlElement currentTime; @Name("Список автозаполнения") + @FindBy(css = ".city-suggest") + private HtmlElement suggestedCitiesList; + + @Name("Элементы списка автозаполнения") @FindBy(css = ".city__name") private List sugesstedCities; @@ -40,6 +44,10 @@ public HtmlElement getCurrentTime() { return currentTime; } + public HtmlElement getSuggestedCitiesList() { + return suggestedCitiesList; + } + public List getSugesstedCities() { return sugesstedCities; } diff --git a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java index 418c363..2f0c894 100644 --- a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -3,6 +3,7 @@ import org.junit.rules.ExternalResource; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.support.ui.WebDriverWait; /** * Created by kurau. @@ -10,9 +11,11 @@ public class WebDriverRule extends ExternalResource { private WebDriver driver; + private WebDriverWait webDriverWait; protected void before() throws Throwable { this.driver = new FirefoxDriver(); + this.webDriverWait = new WebDriverWait(driver, 5); } protected void after() { diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index d582921..b8a521e 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -1,12 +1,16 @@ package ru.qatools.school.steps.websteps; import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.PageMethods; +import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.htmlelements.element.HtmlElement; import static java.lang.String.format; +import static org.hamcrest.Matchers.everyItem; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText; @@ -21,9 +25,13 @@ public class DefaultSteps { public static final String MAIN_PAGE_WITHOUT_PARAMETERS = "http://weather.lanwen.ru"; private WebDriver driver; + private WebDriverWait webDriverWait; + private PageMethods pageMethods; public DefaultSteps(WebDriver driver) { this.driver = driver; + webDriverWait = new WebDriverWait(driver, 5); + pageMethods = new PageMethods(driver); } @Step("Открываем главную страницу для города «{0}»") @@ -47,16 +55,57 @@ public void shouldSeeRightCityInWidgetsTitle(String city){ onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityName(), hasText(city)); } - @Step("Кликаем на {0} ") - public void clickOn(HtmlElement element){ - element.click(); - } - @Step("Число виджетов на странице должно быть равно: {0}") public void shouldHaveWidgetNumberOnMainPage(int numberOfWidgets){ assertThat("Должны видеть виджетов", onMainPage().getWeatherWidget().size(), is(numberOfWidgets)); } + @Step("Должны видеть дату соответствующую системной") + public void shouldSeeDateEqualToSystemDate() { + assertThat("Время или дата не соответствую установленным в системе", + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCurrentTime(), hasText(pageMethods.getCurrentDate())); + } + + @Step("Должны изменить город в заголовке") + public void changeWidgetTitle(String oldCity, String newCity){ + WeatherWidget element = pageMethods.findWidgetByName(oldCity); + pageMethods.clickOn(element.getWidgetTitle().getCityName()); + pageMethods.enterText(newCity, element.getWidgetTitle().getCityNameEditable()); + } + + @Step("Должны увидеть список автозаполнения") + public void suggestList(String part){ + pageMethods.clickOn(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityName()); + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameEditable().clear(); + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameEditable().sendKeys(part); + webDriverWait.until(ExpectedConditions.elementToBeClickable(onMainPage().getWeatherWidget().get(0) + .getWidgetTitle().getSuggestedCitiesList())); + } + + @Step("В списке должны быть только города, соответствующие введенному значению") + public void suggestedCitiesListItems(String part){ + assertThat("В списке отображается неподходящий элемент", + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getSugesstedCities(), + everyItem(pageMethods.regexMatcher(part))); + } + + @Step("Температура должна отображаться в правильном формате") + public void shouldSeeMatchingValueForTemperature(String pattern){ + assertThat("Температура отображается в неверном формате", onMainPage().getWeatherWidget().get(0).getWidgetText().getTemperature(), + pageMethods.regexMatcher(pattern)); + } + + @Step("Погодные данные должны отображаться в правильном формате") + public void shouldSeeMatchingValueForWeatherData(int index, String pattern){ + assertThat("Погодные данные отображается в неверном формате", onMainPage().getWeatherWidget().get(0).getWidgetText() + .getWeatherData().get(index), pageMethods.regexMatcher(pattern)); + } + + @Step("Должны видеть правильный текст в заголовке страницы") + public void shouldSeeTitle(String text){ + assertThat("Неверный заголовок страницы", driver.getTitle(), is(text)); + } + private MainPage onMainPage() { return new MainPage(driver); } From 5404c223a035f2479ff6cfb1a468c6dfade5bdbd Mon Sep 17 00:00:00 2001 From: ava1on Date: Sat, 30 Apr 2016 01:55:54 +0300 Subject: [PATCH 07/21] Updating recording to comments, adding new tests and some refactoring --- .../school/webtests/WeatherWebTest.java | 92 ++++++++++--------- pom.xml | 10 ++ steps-module/pom.xml | 11 +++ .../ru/qatools/school/data/DataPatterns.java | 9 +- .../ru/qatools/school/pages/MainPage.java | 6 +- .../ru/qatools/school/pages/PageMethods.java | 52 +---------- .../school/pages/blocks/WeatherWidget.java | 8 -- .../blocks/widgetblocks/WidgetTitle.java | 16 +--- .../school/steps/websteps/DefaultSteps.java | 72 +++++++-------- 9 files changed, 119 insertions(+), 157 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index 7c25af5..e82447b 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -13,6 +13,7 @@ import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.qatools.school.tp.TPInformerRule; +import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; @RunWith(DataProviderRunner.class) @@ -40,7 +41,8 @@ public static Object[][] temperatureFormat(){ {0, DataPatterns.CELSIUS}, {1, DataPatterns.KELVIN}, {2, DataPatterns.FAHRENHEIT}, - {3, DataPatterns.KAIF} + {3, DataPatterns.KAIF}, + {4, DataPatterns.CELSIUS} }; } @@ -60,7 +62,7 @@ public void initSteps() { } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("6") + @TestCaseId("6") @Title("Должны видеть только кнопку [+] ") public void shouldSeeOnlyAddWidgetButton(){ defaultSteps.openMainPageWithoutParameters(); @@ -69,122 +71,130 @@ public void shouldSeeOnlyAddWidgetButton(){ } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("2") + @TestCaseId("2") @Title("Должны видеть виджет на главной странице") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0)); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("8") + @TestCaseId("8") @Title("В заголовке виджета должны видеть город, указанный в запросе") public void shouldSeeSelectedCityOnWidgetTitle() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSeeRightCityInWidgetsTitle(MOSCOW); + defaultSteps.shouldSeeCityInWidgetsTitle(MOSCOW); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("16") + @TestCaseId("16") @Title("Должны видеть новый виджет при открытии страницы без параметров") public void shouldSeeNewWidgetOnMainPageWithoutParameters() { defaultSteps.openMainPageWithCity(""); - defaultSteps.shouldSeeRightCityInWidgetsTitle(NEW_WIDGET); + defaultSteps.shouldSeeCityInWidgetsTitle(NEW_WIDGET); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("3") + @TestCaseId("3") @Title("Должны видеть на один виджет больше после нажатия на кнопку [+]") public void shouldSeeOneMoreWidget() { defaultSteps.openMainPageWithCity(MOSCOW); - int numberOfWidgets = onMainPage().getWeatherWidget().size(); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); pageMethods.clickOn(onMainPage().getAddNewWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets+1); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("5") + @TestCaseId("5") @Title("Должны видеть на один виджет меньше после нажатия на кнопку [-]") public void shouldSeeLessWidgets(){ defaultSteps.openMainPageWithCity(MOSCOW); - int numberOfWidgets = onMainPage().getWeatherWidget().size(); - pageMethods.clickOn(onMainPage().getWeatherWidget().get(0).getRemoveWidgetButton()); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); + pageMethods.clickOn(onMainPage().getWeatherWidgets().get(0).getRemoveWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets-1); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("9") - @Title("Должны видеть время и дату в установленном в системе формате") + @TestCaseId("9") + @Title("Должны видеть время и дату в формате \"Ч AM/PM, дд ммм гг\"") public void shouldSeeDateAndTime(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSeeDateEqualToSystemDate(); + defaultSteps.shouldMatchPattern(onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getCurrentTime(), DataPatterns.TIME_DATE); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("11") + @TestCaseId("11") @Title("Должны видеть новое название города после изменения") public void shouldSeeNewCityAfterChangeUsingEnterKey(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.changeWidgetTitle(MOSCOW,SPB); - defaultSteps.shouldSeeRightCityInWidgetsTitle(SPB); + defaultSteps.changeWidgetTitle(onMainPage().getWeatherWidgets().get(0), SPB); + defaultSteps.shouldSeeCityInWidgetsTitle(SPB); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("12") + @TestCaseId("12") @Title("Должны видеть список автозаполнения") public void shouldSeeSuggestCitiesList(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.suggestList(PART_OF_CITYNAME); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getSuggestedCitiesList()); + defaultSteps.suggestList(PART_OF_CITYNAME, onMainPage().getWeatherWidgets().get(0).getWidgetTitle()); + defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getSuggestedCitiesList()); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("13") - @Title("В списке автозаполнения должны отображаться только подходящие введенному значению города") + @TestCaseId("13") + @Title("В списке автозаполнения должны отображаться только города, содержащие введенную строку") public void shouldSeeSuitableSuggestedCities(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.suggestList(PART_OF_CITYNAME); - defaultSteps.suggestedCitiesListItems(PART_OF_CITYNAME); + defaultSteps.suggestList(PART_OF_CITYNAME, onMainPage().getWeatherWidgets().get(0).getWidgetTitle()); + defaultSteps.shouldOnlySeeCitiesContaining(PART_OF_CITYNAME); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("14") + @TestCaseId("14") @Title("Должны изменить город используя список автозаполения") public void shouldSeeNewCityAfterChangeUsingSuggestedList(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.suggestList(PART_OF_CITYNAME); - pageMethods.selectElementFromSuggestedList(SPB); - defaultSteps.shouldSeeRightCityInWidgetsTitle(SPB); + defaultSteps.suggestList(PART_OF_CITYNAME, onMainPage().getWeatherWidgets().get(0).getWidgetTitle()); + pageMethods.selectItemFromSuggestedList(SPB); + defaultSteps.shouldSeeCityInWidgetsTitle(SPB); } @Test @UseDataProvider("temperatureFormat") - @ru.yandex.qatools.allure.annotations.TestCaseId("4") - @Title("Погодные данные должны отображаться в правильном формате") - public void shouldSeeTemperatureInCorrectFormat(int id, DataPatterns pattern) { + @TestCaseId("4") + @Title("Температура должна отображатся в правильном формате") + public void shouldSeeTemperature(int numberOfClicks, DataPatterns pattern) { defaultSteps.openMainPageWithCity(MOSCOW); - pageMethods.clickOnSeveralTimes(onMainPage().getWeatherWidget().get(0).getWidgetText().getTemperature(), id); - defaultSteps.shouldSeeMatchingValueForTemperature(pattern.toString()); + pageMethods.clickOnSeveralTimes(onMainPage().getWeatherWidgets().get(0).getWidgetText().getTemperature(), numberOfClicks); + defaultSteps.shouldMatchPattern(onMainPage().getWeatherWidgets().get(0).getWidgetText().getTemperature(), pattern); } @Test @UseDataProvider("weatherDataFormat") - @ru.yandex.qatools.allure.annotations.TestCaseId("7") + @TestCaseId("7") @Title("Погодные данные должны отображаться в правильном формате") - public void shouldSeeWeatherDataInCorrectFormat(int id, DataPatterns pattern) { + public void shouldSeeWeatherData(int id, DataPatterns pattern) { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSeeMatchingValueForWeatherData(id, pattern.toString()); + defaultSteps.shouldMatchPattern(onMainPage().getWeatherWidgets().get(0).getWidgetText().getWeatherData().get(id), pattern); } @Test - @ru.yandex.qatools.allure.annotations.TestCaseId("10") - @Title("Должеы видеть правильны заголовок страницы") + @TestCaseId("10") + @Title("Должны видеть заголовок страницы") public void shouldSeePageTitle(){ defaultSteps.openMainPageWithoutParameters(); defaultSteps.shouldSeeTitle(PAGE_TITLE); } + @Test + @TestCaseId("23") + @Title("Должны видеть иконку погоды") + public void shouldSeeWeatherImage(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0).getWidgetText().getWeatherImage()); + } + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } -} +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 95e6793..a1590c6 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,16 @@ htmlelements-matchers 1.12 + + org.cthul + cthul-matchers + 1.1.0 + + + ru.yandex.qatools.matchers + webdriver-matchers + 1.3 + diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 9bcfe79..cf2339d 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -45,6 +45,17 @@ com.jayway.restassured rest-assured + + + org.cthul + cthul-matchers + 1.1.0 + + + ru.yandex.qatools.matchers + webdriver-matchers + 1.3 + diff --git a/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java b/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java index d53866a..6ace235 100644 --- a/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java +++ b/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java @@ -1,7 +1,7 @@ package ru.qatools.school.data; /** - * Created by sergey.petrov on 25.04.2016. + * @author ava1on */ public enum DataPatterns { CELSIUS("^-?\\d{1,2}\\.\\d °C$"), @@ -10,8 +10,9 @@ public enum DataPatterns { KAIF("^-?\\d{1,2}\\.\\d °Kaif$"), SUNRISE("^Sunrise\\s[0-2][0-9]:[0-5][0-9]$"), SUNSET("^Sunset\\s[0-2][0-9]:[0-5][0-9]$"), - WIND("^Wind\\s\\d{1,} m\\/s$"), - HUMIDITY("^Humidity\\s[0-9]{1,} %$"); + WIND("^Wind\\s\\d{1,}\\.?\\d{0,2}? m\\/s$"), + HUMIDITY("^Humidity\\s[0-9]{1,} %$"), + TIME_DATE("^1?\\d [A|P]M, [1-3]?\\d \\w{3} \\d{2}"); private final String pattern; @@ -20,7 +21,7 @@ public enum DataPatterns { } public String getPattern(){ - return pattern.toString(); + return pattern; } @Override diff --git a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java index ba19c4f..2cef9c8 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -22,14 +22,14 @@ public MainPage(WebDriver driver) { @Name("Список виджетов") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgets; @Name("Кнопка добавления виджетов") @FindBy(css = ".new-card") private HtmlElement addNewWidgetButton; - public List getWeatherWidget() { - return weatherWidget; + public List getWeatherWidgets() { + return weatherWidgets; } public HtmlElement getAddNewWidgetButton(){ diff --git a/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java b/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java index d0643a6..6c15177 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java @@ -1,23 +1,14 @@ package ru.qatools.school.pages; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeDiagnosingMatcher; -import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; -import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.htmlelements.element.HtmlElement; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.List; -import java.util.Locale; -import java.util.regex.Pattern; /** - * Created by ava1on + * @author by ava1on */ public class PageMethods { @@ -41,27 +32,11 @@ public void clickOnSeveralTimes(HtmlElement element, int times){ public void enterText(String text, HtmlElement field){ field.clear(); field.sendKeys(text); - field.sendKeys(Keys.ENTER); } - public String getCurrentDate(){ - SimpleDateFormat sdf = new SimpleDateFormat("h a, dd MMM yy (XXX)", Locale.ENGLISH); - return sdf.format(new Date()); - } - - public void selectElementFromSuggestedList(String city){ - HtmlElement element = findElementByName(city, mainPage.getWeatherWidget().get(0).getWidgetTitle().getSugesstedCities()); - clickOn(element); - webDriverWait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(mainPage.getWeatherWidget().get(0)))); - } - - public WeatherWidget findWidgetByName(String city){ - List widgets=mainPage.getWeatherWidget(); - for (WeatherWidget element : widgets){ - if (element.getWidgetTitle().getCityName().getText().equals(city)) - return element; - } - return null; + public void selectItemFromSuggestedList(String city){ + clickOn(findElementByName(city, mainPage.getWeatherWidgets().get(0).getWidgetTitle().getSuggestedCities())); + webDriverWait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(mainPage.getWeatherWidgets().get(0)))); } public HtmlElement findElementByName(String item, List list){ @@ -70,23 +45,4 @@ public HtmlElement findElementByName(String item, List list){ return elem; return null; } - - public Matcher regexMatcher(String part){ - return new TypeSafeDiagnosingMatcher() { - @Override - protected boolean matchesSafely(HtmlElement element, Description description) { - Pattern pattern = Pattern.compile(".*"+part+".*"); - java.util.regex.Matcher matcher = pattern.matcher(element.getText()); - if (matcher.matches()) - return true; - description.appendText("was ").appendValue(element.getText()); - return false; - } - - @Override - public void describeTo(Description description) { - description.appendText("Название города должно содержать строку ").appendValue(part); - } - }; - } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java index 1186a3e..4f54264 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -20,10 +20,6 @@ public class WeatherWidget extends HtmlElement { @FindBy(css = ".card-text") private WidgetText widgetText; - @Name("Панель управления виджетом") - @FindBy(css = ".card-actions") - private HtmlElement actions; - @Name("Кнопка удаления виджета") @FindBy(css = ".remove-card") private HtmlElement removeWidgetButton; @@ -36,10 +32,6 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public HtmlElement getActions() { - return actions; - } - public HtmlElement getRemoveWidgetButton() { return removeWidgetButton; } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java index 18188e4..71800c2 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -13,13 +13,9 @@ public class WidgetTitle extends HtmlElement { @Name("Название города") - @FindBy(css = ".inplace.inplace_displayed") + @FindBy(css = ".inplace") private HtmlElement cityName; - @Name("Редактируемое поле города") - @FindBy(css = ".inplace.inplace_editable") - private HtmlElement cityNameEditable; - @Name("Время и дата") @FindBy(css = ".card-title__secondary") private HtmlElement currentTime; @@ -30,16 +26,12 @@ public class WidgetTitle extends HtmlElement { @Name("Элементы списка автозаполнения") @FindBy(css = ".city__name") - private List sugesstedCities; + private List suggestedCities; public HtmlElement getCityName(){ return cityName; } - public HtmlElement getCityNameEditable() { - return cityNameEditable; - } - public HtmlElement getCurrentTime() { return currentTime; } @@ -48,8 +40,8 @@ public HtmlElement getSuggestedCitiesList() { return suggestedCitiesList; } - public List getSugesstedCities() { - return sugesstedCities; + public List getSuggestedCities() { + return suggestedCities; } public Rectangle getRect() { diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index b8a521e..47c17fb 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -1,20 +1,26 @@ package ru.qatools.school.steps.websteps; +import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; +import ru.qatools.school.data.DataPatterns; import ru.qatools.school.pages.MainPage; import ru.qatools.school.pages.PageMethods; import ru.qatools.school.pages.blocks.WeatherWidget; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.ArrayList; + import static java.lang.String.format; -import static org.hamcrest.Matchers.everyItem; +import static org.cthul.matchers.CthulMatchers.containsPattern; +import static org.hamcrest.Matchers.*; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.*; +import static ru.yandex.qatools.matchers.webdriver.TextMatcher.text; /** * Created by kurau. @@ -46,62 +52,46 @@ public void openMainPageWithoutParameters(){ @Step("Должны видеть на странице «{0}»") public void shouldSee(HtmlElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + assertThat("Должны видеть элемент", element, allOf(exists(),isDisplayed())); } @Step("Должны видеть в заголовке виджета текст: {0}") - public void shouldSeeRightCityInWidgetsTitle(String city){ + public void shouldSeeCityInWidgetsTitle(String city){ assertThat("Должны видеть текст", - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityName(), hasText(city)); + onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getCityName(), hasText(city)); } @Step("Число виджетов на странице должно быть равно: {0}") public void shouldHaveWidgetNumberOnMainPage(int numberOfWidgets){ - assertThat("Должны видеть виджетов", onMainPage().getWeatherWidget().size(), is(numberOfWidgets)); - } - - @Step("Должны видеть дату соответствующую системной") - public void shouldSeeDateEqualToSystemDate() { - assertThat("Время или дата не соответствую установленным в системе", - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCurrentTime(), hasText(pageMethods.getCurrentDate())); - } - - @Step("Должны изменить город в заголовке") - public void changeWidgetTitle(String oldCity, String newCity){ - WeatherWidget element = pageMethods.findWidgetByName(oldCity); - pageMethods.clickOn(element.getWidgetTitle().getCityName()); - pageMethods.enterText(newCity, element.getWidgetTitle().getCityNameEditable()); + assertThat("Должны видеть виджетов", onMainPage().getWeatherWidgets(), hasSize(numberOfWidgets)); } - @Step("Должны увидеть список автозаполнения") - public void suggestList(String part){ - pageMethods.clickOn(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityName()); - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameEditable().clear(); - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameEditable().sendKeys(part); - webDriverWait.until(ExpectedConditions.elementToBeClickable(onMainPage().getWeatherWidget().get(0) - .getWidgetTitle().getSuggestedCitiesList())); + @Step("Изменяем город в заголовке") + public void changeWidgetTitle(WeatherWidget weatherWidget, String newCity){ + pageMethods.clickOn(weatherWidget.getWidgetTitle().getCityName()); + pageMethods.enterText(newCity, weatherWidget.getWidgetTitle().getCityName()); + weatherWidget.getWidgetTitle().getCityName().sendKeys(Keys.RETURN); } - @Step("В списке должны быть только города, соответствующие введенному значению") - public void suggestedCitiesListItems(String part){ - assertThat("В списке отображается неподходящий элемент", - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getSugesstedCities(), - everyItem(pageMethods.regexMatcher(part))); + @Step("Ввод текста в заголовок и ожидание появления списка автозаполнения") + public void suggestList(String part, WidgetTitle widgetTitle){ + pageMethods.clickOn(widgetTitle.getCityName()); + pageMethods.enterText(part, widgetTitle.getCityName()); + webDriverWait.until(ExpectedConditions.elementToBeClickable(widgetTitle.getSuggestedCitiesList())); } - @Step("Температура должна отображаться в правильном формате") - public void shouldSeeMatchingValueForTemperature(String pattern){ - assertThat("Температура отображается в неверном формате", onMainPage().getWeatherWidget().get(0).getWidgetText().getTemperature(), - pageMethods.regexMatcher(pattern)); + @Step("В списке должны быть только города, содержащие {0}") + public void shouldOnlySeeCitiesContaining(String part){ + assertThat("", new ArrayList<>(onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getSuggestedCities()), + everyItem(text(containsString(part)))); } - @Step("Погодные данные должны отображаться в правильном формате") - public void shouldSeeMatchingValueForWeatherData(int index, String pattern){ - assertThat("Погодные данные отображается в неверном формате", onMainPage().getWeatherWidget().get(0).getWidgetText() - .getWeatherData().get(index), pageMethods.regexMatcher(pattern)); + @Step("Данные в {0} отображаются в формате {1}") + public void shouldMatchPattern(HtmlElement element, DataPatterns pattern){ + assertThat("Данные отображаются в неверном формате", element.getText(), containsPattern(pattern.toString())); } - @Step("Должны видеть правильный текст в заголовке страницы") + @Step("Должны видеть в заголовке страницы {0}") public void shouldSeeTitle(String text){ assertThat("Неверный заголовок страницы", driver.getTitle(), is(text)); } From 8d2fdcead4eb5d238b6f8ebc45ba9edca4d3b47b Mon Sep 17 00:00:00 2001 From: ava1on Date: Sat, 30 Apr 2016 20:30:53 +0300 Subject: [PATCH 08/21] Refactoring: moving PageMethods methods to DefaultSteps --- .../school/webtests/WeatherWebTest.java | 21 ++++---- .../ru/qatools/school/pages/PageMethods.java | 48 ------------------- .../school/steps/websteps/DefaultSteps.java | 43 +++++++++++++---- 3 files changed, 43 insertions(+), 69 deletions(-) delete mode 100644 steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index e82447b..6b2bc1d 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -9,7 +9,6 @@ import org.junit.runner.RunWith; import ru.qatools.school.data.DataPatterns; import ru.qatools.school.pages.MainPage; -import ru.qatools.school.pages.PageMethods; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.qatools.school.tp.TPInformerRule; @@ -19,11 +18,11 @@ @RunWith(DataProviderRunner.class) public class WeatherWebTest { - public static final String MOSCOW = "Moscow"; - public static final String SPB = "Saint Petersburg"; - public static final String PART_OF_CITYNAME = "Saint P"; - public static final String PAGE_TITLE = "Weather"; - public static final String NEW_WIDGET = "What a city?"; + private static final String MOSCOW = "Moscow"; + private static final String SPB = "Saint Petersburg"; + private static final String PART_OF_CITYNAME = "Saint P"; + private static final String PAGE_TITLE = "Weather"; + private static final String NEW_WIDGET = "What a city?"; @DataProvider public static Object[][] weatherDataFormat() { @@ -47,7 +46,6 @@ public static Object[][] temperatureFormat(){ } private DefaultSteps defaultSteps; - private PageMethods pageMethods; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); @@ -58,7 +56,6 @@ public static Object[][] temperatureFormat(){ @Before public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - pageMethods = new PageMethods(webDriverRule.getDriver()); } @Test @@ -100,7 +97,7 @@ public void shouldSeeNewWidgetOnMainPageWithoutParameters() { public void shouldSeeOneMoreWidget() { defaultSteps.openMainPageWithCity(MOSCOW); int numberOfWidgets = onMainPage().getWeatherWidgets().size(); - pageMethods.clickOn(onMainPage().getAddNewWidgetButton()); + defaultSteps.clickOn(onMainPage().getAddNewWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets+1); } @@ -110,7 +107,7 @@ public void shouldSeeOneMoreWidget() { public void shouldSeeLessWidgets(){ defaultSteps.openMainPageWithCity(MOSCOW); int numberOfWidgets = onMainPage().getWeatherWidgets().size(); - pageMethods.clickOn(onMainPage().getWeatherWidgets().get(0).getRemoveWidgetButton()); + defaultSteps.clickOn(onMainPage().getWeatherWidgets().get(0).getRemoveWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets-1); } @@ -155,7 +152,7 @@ public void shouldSeeSuitableSuggestedCities(){ public void shouldSeeNewCityAfterChangeUsingSuggestedList(){ defaultSteps.openMainPageWithCity(MOSCOW); defaultSteps.suggestList(PART_OF_CITYNAME, onMainPage().getWeatherWidgets().get(0).getWidgetTitle()); - pageMethods.selectItemFromSuggestedList(SPB); + defaultSteps.selectItemFromSuggestedList(SPB); defaultSteps.shouldSeeCityInWidgetsTitle(SPB); } @@ -165,7 +162,7 @@ public void shouldSeeNewCityAfterChangeUsingSuggestedList(){ @Title("Температура должна отображатся в правильном формате") public void shouldSeeTemperature(int numberOfClicks, DataPatterns pattern) { defaultSteps.openMainPageWithCity(MOSCOW); - pageMethods.clickOnSeveralTimes(onMainPage().getWeatherWidgets().get(0).getWidgetText().getTemperature(), numberOfClicks); + defaultSteps.clickOnSeveralTimes(onMainPage().getWeatherWidgets().get(0).getWidgetText().getTemperature(), numberOfClicks); defaultSteps.shouldMatchPattern(onMainPage().getWeatherWidgets().get(0).getWidgetText().getTemperature(), pattern); } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java b/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java deleted file mode 100644 index 6c15177..0000000 --- a/steps-module/src/main/java/ru/qatools/school/pages/PageMethods.java +++ /dev/null @@ -1,48 +0,0 @@ -package ru.qatools.school.pages; - -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; -import ru.yandex.qatools.htmlelements.element.HtmlElement; - -import java.util.List; - -/** - * @author by ava1on - */ -public class PageMethods { - - private MainPage mainPage; - private WebDriverWait webDriverWait; - - public PageMethods(WebDriver driver){ - mainPage = new MainPage(driver); - webDriverWait = new WebDriverWait(driver, 5); - } - - public void clickOn(HtmlElement element){ - element.click(); - } - - public void clickOnSeveralTimes(HtmlElement element, int times){ - while(times-- > 0) - element.click(); - } - - public void enterText(String text, HtmlElement field){ - field.clear(); - field.sendKeys(text); - } - - public void selectItemFromSuggestedList(String city){ - clickOn(findElementByName(city, mainPage.getWeatherWidgets().get(0).getWidgetTitle().getSuggestedCities())); - webDriverWait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(mainPage.getWeatherWidgets().get(0)))); - } - - public HtmlElement findElementByName(String item, List list){ - for(HtmlElement elem : list) - if(elem.getText().equals(item)) - return elem; - return null; - } -} diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 47c17fb..66b2553 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -6,13 +6,13 @@ import org.openqa.selenium.support.ui.WebDriverWait; import ru.qatools.school.data.DataPatterns; import ru.qatools.school.pages.MainPage; -import ru.qatools.school.pages.PageMethods; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.htmlelements.element.HtmlElement; import java.util.ArrayList; +import java.util.List; import static java.lang.String.format; import static org.cthul.matchers.CthulMatchers.containsPattern; @@ -27,17 +27,15 @@ */ public class DefaultSteps { - public static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; - public static final String MAIN_PAGE_WITHOUT_PARAMETERS = "http://weather.lanwen.ru"; + private static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + private static final String MAIN_PAGE_WITHOUT_PARAMETERS = "http://weather.lanwen.ru"; private WebDriver driver; private WebDriverWait webDriverWait; - private PageMethods pageMethods; public DefaultSteps(WebDriver driver) { this.driver = driver; webDriverWait = new WebDriverWait(driver, 5); - pageMethods = new PageMethods(driver); } @Step("Открываем главную страницу для города «{0}»") @@ -68,15 +66,15 @@ public void shouldHaveWidgetNumberOnMainPage(int numberOfWidgets){ @Step("Изменяем город в заголовке") public void changeWidgetTitle(WeatherWidget weatherWidget, String newCity){ - pageMethods.clickOn(weatherWidget.getWidgetTitle().getCityName()); - pageMethods.enterText(newCity, weatherWidget.getWidgetTitle().getCityName()); + clickOn(weatherWidget.getWidgetTitle().getCityName()); + enterText(newCity, weatherWidget.getWidgetTitle().getCityName()); weatherWidget.getWidgetTitle().getCityName().sendKeys(Keys.RETURN); } @Step("Ввод текста в заголовок и ожидание появления списка автозаполнения") public void suggestList(String part, WidgetTitle widgetTitle){ - pageMethods.clickOn(widgetTitle.getCityName()); - pageMethods.enterText(part, widgetTitle.getCityName()); + clickOn(widgetTitle.getCityName()); + enterText(part, widgetTitle.getCityName()); webDriverWait.until(ExpectedConditions.elementToBeClickable(widgetTitle.getSuggestedCitiesList())); } @@ -96,7 +94,34 @@ public void shouldSeeTitle(String text){ assertThat("Неверный заголовок страницы", driver.getTitle(), is(text)); } + @Step("Выбираем город из списка автозаполнения") + public void selectItemFromSuggestedList(String city){ + clickOn(findElementByName(city, onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getSuggestedCities())); + webDriverWait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(onMainPage().getWeatherWidgets().get(0)))); + } + private MainPage onMainPage() { return new MainPage(driver); } + + private void enterText(String text, HtmlElement field){ + field.clear(); + field.sendKeys(text); + } + + public void clickOn(HtmlElement element){ + element.click(); + } + + public void clickOnSeveralTimes(HtmlElement element, int times){ + while(times-- > 0) + element.click(); + } + + private HtmlElement findElementByName(String item, List list){ + for(HtmlElement elem : list) + if(elem.getText().equals(item)) + return elem; + return null; + } } From fba20d3601b0fcc04dec2ff161d62ba48433852a Mon Sep 17 00:00:00 2001 From: ava1on Date: Mon, 2 May 2016 19:09:49 +0300 Subject: [PATCH 09/21] Fixing error in regexp for time and date --- .../src/main/java/ru/qatools/school/data/DataPatterns.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java b/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java index 6ace235..ae2260d 100644 --- a/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java +++ b/steps-module/src/main/java/ru/qatools/school/data/DataPatterns.java @@ -12,7 +12,7 @@ public enum DataPatterns { SUNSET("^Sunset\\s[0-2][0-9]:[0-5][0-9]$"), WIND("^Wind\\s\\d{1,}\\.?\\d{0,2}? m\\/s$"), HUMIDITY("^Humidity\\s[0-9]{1,} %$"), - TIME_DATE("^1?\\d [A|P]M, [1-3]?\\d \\w{3} \\d{2}"); + TIME_DATE("^1?\\d [A|P]M, [0-3]\\d \\w{3} \\d{2}"); private final String pattern; From d9b45bf2f12843692315ccdaf536d2bf6c90e237 Mon Sep 17 00:00:00 2001 From: ava1on Date: Wed, 4 May 2016 00:30:10 +0300 Subject: [PATCH 10/21] First api auto test using Rest-assured --- api-tests-module/pom.xml | 44 +++++++++++++++++++ .../school/Responces/CitiesResponse.java | 28 ++++++++++++ .../school/apitests/RestAssuredAPITests.java | 28 ++++++++++++ .../school/apitests/RetrofitAPITests.java | 7 +++ .../ru/qatools/school/data/Constants.java | 11 +++++ pom.xml | 1 + 6 files changed, 119 insertions(+) create mode 100644 api-tests-module/pom.xml create mode 100644 api-tests-module/src/test/java/ru/qatools/school/Responces/CitiesResponse.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/data/Constants.java diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml new file mode 100644 index 0000000..cc78f76 --- /dev/null +++ b/api-tests-module/pom.xml @@ -0,0 +1,44 @@ + + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + 4.0.0 + + api-tests-module + API Tests + + + + com.jayway.restassured + rest-assured + 2.9.0 + + + com.squareup.retrofit2 + retrofit + 2.0.2 + + + com.google.code.gson + gson + 2.6.2 + test + + + org.hamcrest + hamcrest-all + 1.3 + + + ru.yandex.qatools.allure + allure-junit-adaptor + 1.4.23 + + + + \ No newline at end of file diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responces/CitiesResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responces/CitiesResponse.java new file mode 100644 index 0000000..a72c7ff --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/Responces/CitiesResponse.java @@ -0,0 +1,28 @@ +package ru.qatools.school.Responces; + +/** + * @author ava1on + */ +public class CitiesResponse { + private String country; + private String name; + private int uid; + + public CitiesResponse(String country, String name, int uid) { + this.country = country; + this.name = name; + this.uid = uid; + } + + public String getCountry() { + return country; + } + + public String getName() { + return name; + } + + public int getUid() { + return uid; + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java new file mode 100644 index 0000000..ce945ad --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java @@ -0,0 +1,28 @@ +package ru.qatools.school.apitests; + +import org.junit.Test; +import ru.qatools.school.Responces.CitiesResponse; +import ru.yandex.qatools.allure.annotations.Title; + +import static com.jayway.restassured.RestAssured.given; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static ru.qatools.school.data.Constants.*; + +/** + * @author ava1on + */ +public class RestAssuredAPITests { + + @Test + @Title("Должны получить заданное в параметре количество городов в ответе") + public void shouldReturnRequestedNumberOfCities(){ + CitiesResponse[] citiesArray = + given(). + baseUri(BASE_URL). + param(LIMIT_PARAMETER, LIMIT_VALUE). + when(). + get(CITIES_REQUEST).as(CitiesResponse[].class); + assertThat("Неверное количество городов в ответе", citiesArray.length, is(LIMIT_VALUE)); + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java new file mode 100644 index 0000000..13ef6d5 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java @@ -0,0 +1,7 @@ +package ru.qatools.school.apitests; + +/** + * @author ava1on + */ +public class RetrofitAPITests { +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java new file mode 100644 index 0000000..b34fba8 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java @@ -0,0 +1,11 @@ +package ru.qatools.school.data; + +/** + * @author ava1on + */ +public class Constants { + public static final String BASE_URL = "http://weather.lanwen.ru/api"; + public static final String LIMIT_PARAMETER = "limit"; + public static final String CITIES_REQUEST = "cities"; + public static final int LIMIT_VALUE = 3; +} diff --git a/pom.xml b/pom.xml index a1590c6..8b94510 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ steps-module commons-module + api-tests-module From 4e5275089cf7fc91dd49c256effad78aef7f36bf Mon Sep 17 00:00:00 2001 From: ava1on Date: Wed, 4 May 2016 21:22:12 +0300 Subject: [PATCH 11/21] Adding second test for Rest assured --- .../CitiesResponse.java | 2 +- .../school/Responses/TemperatureValues.java | 22 ++++++ .../school/Responses/WeatherResponse.java | 72 +++++++++++++++++++ .../school/apitests/RestAssuredAPITests.java | 24 ++++++- .../ru/qatools/school/data/Constants.java | 4 ++ 5 files changed, 120 insertions(+), 4 deletions(-) rename api-tests-module/src/test/java/ru/qatools/school/{Responces => Responses}/CitiesResponse.java (92%) create mode 100644 api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responces/CitiesResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java similarity index 92% rename from api-tests-module/src/test/java/ru/qatools/school/Responces/CitiesResponse.java rename to api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java index a72c7ff..94368c5 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/Responces/CitiesResponse.java +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java @@ -1,4 +1,4 @@ -package ru.qatools.school.Responces; +package ru.qatools.school.Responses; /** * @author ava1on diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java new file mode 100644 index 0000000..2c595bf --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java @@ -0,0 +1,22 @@ +package ru.qatools.school.Responses; + +/** + * @author ava1on + */ +public class TemperatureValues { + private String unit; + private double value; + + public TemperatureValues(String unit, double value) { + this.unit = unit; + this.value = value; + } + + public String getUnit() { + return unit; + } + + public double getValue() { + return value; + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java new file mode 100644 index 0000000..4e4c21f --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java @@ -0,0 +1,72 @@ +package ru.qatools.school.Responses; + +import java.util.List; +import java.util.Map; + +/** + * @author ava1on + */ +public class WeatherResponse { + private String city; + private String daypart; + private long dt; + private int humidity; + private long sunset; + private long sunrise; + private TemperatureValues[] temperatures; + private int weatherCode; + private double wind; + + public WeatherResponse(String city, String daypart, long dt, int humidity, long sunset, long sunrise, + TemperatureValues[] temperatures, int weatherCode, double wind) { + this.city = city; + this.daypart = daypart; + this.dt = dt; + this.humidity = humidity; + this.sunset = sunset; + this.sunrise = sunrise; + this.temperatures = temperatures; + this.weatherCode = weatherCode; + this.wind = wind; + } + + public String getCity() { + return city; + } + + public String getDaypart() { + return daypart; + } + + public long getDt() { + return dt; + } + + public int getHumidity() { + return humidity; + } + + public long getSunset() { + return sunset; + } + + public long getSunrise() { + return sunrise; + } + + public TemperatureValues[] getTemperatures() { + return temperatures; + } + + public int getWeatherCode() { + return weatherCode; + } + + public double getWind() { + return wind; + } + + public Double recalculateCelsiusToFahrenheit(){ + return (this.getTemperatures()[0].getValue()*9/5+32); + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java index ce945ad..a4d2f27 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java @@ -1,11 +1,14 @@ package ru.qatools.school.apitests; +import org.apache.http.HttpStatus; import org.junit.Test; -import ru.qatools.school.Responces.CitiesResponse; +import ru.qatools.school.Responses.CitiesResponse; +import ru.qatools.school.Responses.WeatherResponse; import ru.yandex.qatools.allure.annotations.Title; import static com.jayway.restassured.RestAssured.given; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.is; import static ru.qatools.school.data.Constants.*; @@ -22,7 +25,22 @@ public void shouldReturnRequestedNumberOfCities(){ baseUri(BASE_URL). param(LIMIT_PARAMETER, LIMIT_VALUE). when(). - get(CITIES_REQUEST).as(CitiesResponse[].class); + get(CITIES_REQUEST). + then().statusCode(HttpStatus.SC_OK). + and().extract(). + body().as(CitiesResponse[].class); assertThat("Неверное количество городов в ответе", citiesArray.length, is(LIMIT_VALUE)); } -} + + @Test + public void shouldReturnCompatibleTemperatureValues(){ + WeatherResponse weatherResponse = + given(). + baseUri(BASE_URL). + param(CITY_PARAMETER, CITY_VALUE). + when(). + get(WEATHER_REQUEST).as(WeatherResponse.class); + assertThat("Значение температуры не правильно переведено из шкалы Цельсия в шкалу Фаренгейта", weatherResponse.getTemperatures()[2].getValue(), + is(closeTo(weatherResponse.recalculateCelsiusToFahrenheit(), TEMPERATURE_ERROR))); + } +} \ No newline at end of file diff --git a/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java index b34fba8..94e46cf 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java +++ b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java @@ -8,4 +8,8 @@ public class Constants { public static final String LIMIT_PARAMETER = "limit"; public static final String CITIES_REQUEST = "cities"; public static final int LIMIT_VALUE = 3; + public static final String WEATHER_REQUEST = "weather"; + public static final String CITY_PARAMETER = "city"; + public static final String CITY_VALUE = "Saint Petersburg"; + public static final double TEMPERATURE_ERROR = 0.1; } From 6e56c159ad9a76fd3ddbe03264dc5145913168fa Mon Sep 17 00:00:00 2001 From: ava1on Date: Wed, 4 May 2016 21:28:53 +0300 Subject: [PATCH 12/21] Added Title and statusCode verification for second test --- .../qatools/school/apitests/RestAssuredAPITests.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java index a4d2f27..d6dd737 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java @@ -1,6 +1,7 @@ package ru.qatools.school.apitests; import org.apache.http.HttpStatus; +import org.apache.http.protocol.HTTP; import org.junit.Test; import ru.qatools.school.Responses.CitiesResponse; import ru.qatools.school.Responses.WeatherResponse; @@ -33,14 +34,19 @@ public void shouldReturnRequestedNumberOfCities(){ } @Test - public void shouldReturnCompatibleTemperatureValues(){ + @Title("Значение температуры по шкале Фаренгейта должно соответствовать значению по шкале Цельсия") + public void shouldReturnCompatibleTemperatureValuesForCelsiusAndFahrenheit(){ WeatherResponse weatherResponse = given(). baseUri(BASE_URL). param(CITY_PARAMETER, CITY_VALUE). when(). - get(WEATHER_REQUEST).as(WeatherResponse.class); - assertThat("Значение температуры не правильно переведено из шкалы Цельсия в шкалу Фаренгейта", weatherResponse.getTemperatures()[2].getValue(), + get(WEATHER_REQUEST). + then().statusCode(HttpStatus.SC_OK). + and().extract(). + body().as(WeatherResponse.class); + assertThat("Значение температуры не правильно переведено из шкалы Цельсия в шкалу Фаренгейта", + weatherResponse.getTemperatures()[2].getValue(), is(closeTo(weatherResponse.recalculateCelsiusToFahrenheit(), TEMPERATURE_ERROR))); } } \ No newline at end of file From c4fa2c6383f716e6b9aee2c74e831762a6f3885b Mon Sep 17 00:00:00 2001 From: ava1on Date: Wed, 4 May 2016 21:45:20 +0300 Subject: [PATCH 13/21] Refactoring: removed unused imports and unused getters --- .../school/Responses/CitiesResponse.java | 12 ------- .../school/Responses/TemperatureValues.java | 4 --- .../school/Responses/WeatherResponse.java | 35 ------------------- .../school/apitests/RestAssuredAPITests.java | 1 - 4 files changed, 52 deletions(-) diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java index 94368c5..f132b0d 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java @@ -13,16 +13,4 @@ public CitiesResponse(String country, String name, int uid) { this.name = name; this.uid = uid; } - - public String getCountry() { - return country; - } - - public String getName() { - return name; - } - - public int getUid() { - return uid; - } } diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java index 2c595bf..ad0b3d4 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java @@ -12,10 +12,6 @@ public TemperatureValues(String unit, double value) { this.value = value; } - public String getUnit() { - return unit; - } - public double getValue() { return value; } diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java index 4e4c21f..cd8ae37 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java @@ -1,8 +1,5 @@ package ru.qatools.school.Responses; -import java.util.List; -import java.util.Map; - /** * @author ava1on */ @@ -30,42 +27,10 @@ public WeatherResponse(String city, String daypart, long dt, int humidity, long this.wind = wind; } - public String getCity() { - return city; - } - - public String getDaypart() { - return daypart; - } - - public long getDt() { - return dt; - } - - public int getHumidity() { - return humidity; - } - - public long getSunset() { - return sunset; - } - - public long getSunrise() { - return sunrise; - } - public TemperatureValues[] getTemperatures() { return temperatures; } - public int getWeatherCode() { - return weatherCode; - } - - public double getWind() { - return wind; - } - public Double recalculateCelsiusToFahrenheit(){ return (this.getTemperatures()[0].getValue()*9/5+32); } diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java index d6dd737..4f9bd6b 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredAPITests.java @@ -1,7 +1,6 @@ package ru.qatools.school.apitests; import org.apache.http.HttpStatus; -import org.apache.http.protocol.HTTP; import org.junit.Test; import ru.qatools.school.Responses.CitiesResponse; import ru.qatools.school.Responses.WeatherResponse; From b6ea52d04ec958f1abddea463f9175f560a76284 Mon Sep 17 00:00:00 2001 From: ava1on Date: Thu, 5 May 2016 00:00:48 +0300 Subject: [PATCH 14/21] Added test cases via Retrofit --- api-tests-module/pom.xml | 5 ++ .../school/apitests/RetrofitAPITests.java | 52 +++++++++++++++++++ .../ru/qatools/school/data/Constants.java | 3 +- .../ru/qatools/school/interfaces/Cities.java | 18 +++++++ .../ru/qatools/school/interfaces/Weather.java | 17 ++++++ 5 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 api-tests-module/src/test/java/ru/qatools/school/interfaces/Cities.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/interfaces/Weather.java diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml index cc78f76..3199fe0 100644 --- a/api-tests-module/pom.xml +++ b/api-tests-module/pom.xml @@ -29,6 +29,11 @@ 2.6.2 test + + com.squareup.retrofit2 + converter-gson + 2.0.2 + org.hamcrest hamcrest-all diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java index 13ef6d5..a4401b9 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java @@ -1,7 +1,59 @@ package ru.qatools.school.apitests; +import org.apache.http.HttpStatus; +import org.hamcrest.Matchers; +import org.junit.BeforeClass; +import org.junit.Test; +import retrofit2.Call; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import ru.qatools.school.Responses.CitiesResponse; +import ru.qatools.school.Responses.WeatherResponse; +import ru.qatools.school.interfaces.Cities; +import ru.qatools.school.interfaces.Weather; +import ru.yandex.qatools.allure.annotations.Title; + +import java.io.IOException; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.core.Is.is; +import static ru.qatools.school.data.Constants.*; + /** * @author ava1on */ public class RetrofitAPITests { + + private static Retrofit retrofit; + + @BeforeClass + public static void initRetrofit(){ + retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build(); + } + + @Test + @Title("Должны получить заданное в параметре количество городов в ответе") + public void shouldReturnRequestedNumberOfCities() throws IOException{ + Cities cities = retrofit.create(Cities.class); + Call> request= cities.citiesList(LIMIT_VALUE); + Response> response = request.execute(); + assertThat("Код ответа неверный", response.code(), is(HttpStatus.SC_OK)); + assertThat("Неверное количество городов в ответе", response.body(), hasSize(LIMIT_VALUE)); + } + + @Test + @Title("Значение температуры по шкале Фаренгейта должно соответствовать значению по шкале Цельсия") + public void shouldReturnCompatibleTemperatureValuesForCelsiusAndFahrenheit() throws IOException{ + Weather weather = retrofit.create(Weather.class); + Call request = weather.weather(CITY_PARAMETER, null); + Response response = request.execute(); + assertThat("Код ответа неверный", response.code(), is(HttpStatus.SC_OK)); + assertThat("Значение температуры не правильно переведено из шкалы Цельсия в шкалу Фаренгейта", + response.body().getTemperatures()[2].getValue(), + Matchers.is(closeTo(response.body().recalculateCelsiusToFahrenheit(), TEMPERATURE_ERROR))); + } } diff --git a/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java index 94e46cf..6f0fd87 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java +++ b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java @@ -4,7 +4,7 @@ * @author ava1on */ public class Constants { - public static final String BASE_URL = "http://weather.lanwen.ru/api"; + public static final String BASE_URL = "http://weather.lanwen.ru/api/"; public static final String LIMIT_PARAMETER = "limit"; public static final String CITIES_REQUEST = "cities"; public static final int LIMIT_VALUE = 3; @@ -12,4 +12,5 @@ public class Constants { public static final String CITY_PARAMETER = "city"; public static final String CITY_VALUE = "Saint Petersburg"; public static final double TEMPERATURE_ERROR = 0.1; + public static final String REGION_PARAMETER = "region"; } diff --git a/api-tests-module/src/test/java/ru/qatools/school/interfaces/Cities.java b/api-tests-module/src/test/java/ru/qatools/school/interfaces/Cities.java new file mode 100644 index 0000000..3e32fe8 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/interfaces/Cities.java @@ -0,0 +1,18 @@ +package ru.qatools.school.interfaces; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; +import ru.qatools.school.Responses.CitiesResponse; + +import java.util.List; + +import static ru.qatools.school.data.Constants.LIMIT_PARAMETER; + +/** + * @author ava1on + */ +public interface Cities { + @GET("cities") + Call> citiesList(@Query(LIMIT_PARAMETER) int limitValue); +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/interfaces/Weather.java b/api-tests-module/src/test/java/ru/qatools/school/interfaces/Weather.java new file mode 100644 index 0000000..6ff0d8a --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/interfaces/Weather.java @@ -0,0 +1,17 @@ +package ru.qatools.school.interfaces; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; +import ru.qatools.school.Responses.WeatherResponse; + +import static ru.qatools.school.data.Constants.CITY_PARAMETER; +import static ru.qatools.school.data.Constants.REGION_PARAMETER; + +/** + * @author ava1on + */ +public interface Weather { + @GET("weather") + Call weather(@Query(CITY_PARAMETER) String city, @Query(REGION_PARAMETER) String region); +} \ No newline at end of file From 76151dd8de4707210cb86c2ab385e60c22e905b6 Mon Sep 17 00:00:00 2001 From: ava1on Date: Fri, 6 May 2016 22:22:51 +0300 Subject: [PATCH 15/21] Removed unused Responses classes fields and getters --- .../school/Responses/CitiesResponse.java | 8 +------- .../school/Responses/TemperatureValues.java | 4 +--- .../school/Responses/WeatherResponse.java | 19 +------------------ 3 files changed, 3 insertions(+), 28 deletions(-) diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java index f132b0d..f35b949 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/CitiesResponse.java @@ -4,13 +4,7 @@ * @author ava1on */ public class CitiesResponse { - private String country; - private String name; - private int uid; - public CitiesResponse(String country, String name, int uid) { - this.country = country; - this.name = name; - this.uid = uid; + public CitiesResponse() { } } diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java index ad0b3d4..965a8c4 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/TemperatureValues.java @@ -4,11 +4,9 @@ * @author ava1on */ public class TemperatureValues { - private String unit; private double value; - public TemperatureValues(String unit, double value) { - this.unit = unit; + public TemperatureValues(double value) { this.value = value; } diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java index cd8ae37..219e4b1 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/WeatherResponse.java @@ -4,27 +4,10 @@ * @author ava1on */ public class WeatherResponse { - private String city; - private String daypart; - private long dt; - private int humidity; - private long sunset; - private long sunrise; private TemperatureValues[] temperatures; - private int weatherCode; - private double wind; - public WeatherResponse(String city, String daypart, long dt, int humidity, long sunset, long sunrise, - TemperatureValues[] temperatures, int weatherCode, double wind) { - this.city = city; - this.daypart = daypart; - this.dt = dt; - this.humidity = humidity; - this.sunset = sunset; - this.sunrise = sunrise; + public WeatherResponse(TemperatureValues[] temperatures) { this.temperatures = temperatures; - this.weatherCode = weatherCode; - this.wind = wind; } public TemperatureValues[] getTemperatures() { From 4f510bb7d53d8d2930750de906113a5cef8d4c5a Mon Sep 17 00:00:00 2001 From: ava1on Date: Sat, 7 May 2016 01:13:30 +0300 Subject: [PATCH 16/21] Added test for database and api --- api-tests-module/pom.xml | 10 ++++ .../school/Responses/SuggestResponse.java | 12 +++++ .../ru/qatools/school/apitests/DbAPITest.java | 49 +++++++++++++++++++ .../ru/qatools/school/data/Constants.java | 3 ++ .../main/java/ru/qatools/school/DbClient.java | 7 +++ 5 files changed, 81 insertions(+) create mode 100644 api-tests-module/src/test/java/ru/qatools/school/Responses/SuggestResponse.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml index 3199fe0..76442e0 100644 --- a/api-tests-module/pom.xml +++ b/api-tests-module/pom.xml @@ -44,6 +44,16 @@ allure-junit-adaptor 1.4.23 + + ru.qatools.school + dbclient-module + 1.0-SNAPSHOT + + + ru.yandex.qatools.matchers + collection-matchers + 1.3 + \ No newline at end of file diff --git a/api-tests-module/src/test/java/ru/qatools/school/Responses/SuggestResponse.java b/api-tests-module/src/test/java/ru/qatools/school/Responses/SuggestResponse.java new file mode 100644 index 0000000..699b312 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/Responses/SuggestResponse.java @@ -0,0 +1,12 @@ +package ru.qatools.school.Responses; + +/** + * @author ava1on + */ +public class SuggestResponse { + private int id; + + public SuggestResponse(int id){ + this.id = id; + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java new file mode 100644 index 0000000..7ca5963 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java @@ -0,0 +1,49 @@ +package ru.qatools.school.apitests; + +import org.apache.http.HttpStatus; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import ru.qatools.school.DbClient; +import ru.yandex.qatools.allure.annotations.Title; + +import java.util.List; + +import static com.jayway.restassured.RestAssured.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static ru.qatools.school.data.Constants.*; +import static ru.yandex.qatools.matchers.collection.HasSameItemsAsListMatcher.hasSameItemsAsList; + +/** + * @author ava1on + */ +public class DbAPITest { + private DbClient dbClient; + + @Before + public void setupDbConnection(){ + dbClient = new DbClient(); + } + + @After + public void closeDbConnection(){ + dbClient.close(); + } + + @Test + @Title("") + public void apiResponseShouldMatchDatabaseData(){ + List ids = + given() + .baseUri(BASE_URL) + .param(QUERY_PARAMETER, CITYNAME_PART) + .when() + .get(SUGGEST_REQUEST) + .then() + .assertThat().statusCode(HttpStatus.SC_OK) + .and().extract().body().path("id"); + System.out.println(1); + assertThat("Полученные через API данные не соответствуют Database", ids, + hasSameItemsAsList(dbClient.getCitiesByNamePart(CITYNAME_PART))); + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java index 6f0fd87..91be564 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java +++ b/api-tests-module/src/test/java/ru/qatools/school/data/Constants.java @@ -13,4 +13,7 @@ public class Constants { public static final String CITY_VALUE = "Saint Petersburg"; public static final double TEMPERATURE_ERROR = 0.1; public static final String REGION_PARAMETER = "region"; + public static final String SUGGEST_REQUEST = "suggest"; + public static final String QUERY_PARAMETER = "query"; + public static final String CITYNAME_PART = "Saint"; } diff --git a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java index 12e1204..5479bd4 100644 --- a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java +++ b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java @@ -6,6 +6,7 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.List; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; @@ -39,6 +40,12 @@ public String getCityById(Integer id) { return result.getValue(0, String.class); } + public List getCitiesByNamePart(String namePart){ + return create.selectFrom(table("City")) + .where(field("name").like("%" + namePart + "%")) + .fetch().getValues(field("id"), Integer.class); + } + public void close() { try { connection.close(); From 723d594cba896920eae86d7ffb8b0dc72fab6810 Mon Sep 17 00:00:00 2001 From: ava1on Date: Sat, 7 May 2016 22:40:31 +0300 Subject: [PATCH 17/21] Changed matcher in db test --- .../test/java/ru/qatools/school/apitests/DbAPITest.java | 9 ++++----- .../src/main/java/ru/qatools/school/DbClient.java | 6 ++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java index 7ca5963..7a01fd9 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java @@ -9,10 +9,10 @@ import java.util.List; -import static com.jayway.restassured.RestAssured.*; +import static com.jayway.restassured.RestAssured.given; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; import static ru.qatools.school.data.Constants.*; -import static ru.yandex.qatools.matchers.collection.HasSameItemsAsListMatcher.hasSameItemsAsList; /** * @author ava1on @@ -31,7 +31,7 @@ public void closeDbConnection(){ } @Test - @Title("") + @Title("Списки городов, полученные через API и Database, должны совпадать") public void apiResponseShouldMatchDatabaseData(){ List ids = given() @@ -42,8 +42,7 @@ public void apiResponseShouldMatchDatabaseData(){ .then() .assertThat().statusCode(HttpStatus.SC_OK) .and().extract().body().path("id"); - System.out.println(1); assertThat("Полученные через API данные не соответствуют Database", ids, - hasSameItemsAsList(dbClient.getCitiesByNamePart(CITYNAME_PART))); + is(dbClient.getCitiesByNamePart(CITYNAME_PART))); } } diff --git a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java index 5479bd4..b9fb76d 100644 --- a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java +++ b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java @@ -1,6 +1,8 @@ package ru.qatools.school; -import org.jooq.*; +import org.jooq.DSLContext; +import org.jooq.Record1; +import org.jooq.SQLDialect; import org.jooq.impl.DSL; import java.sql.Connection; @@ -18,7 +20,7 @@ public class DbClient { private static final String CONNECTION_STRING = System.getProperty("db.url", "jdbc:mysql://db.host.ru:3310/db_name"); private static final String USER = System.getProperty("db.user", "user"); - private static final String PASSWORD = System.getProperty("db.password", "password");; + private static final String PASSWORD = System.getProperty("db.password", "password"); private Connection connection; private DSLContext create; From 13b23a8f3d049301e4e5fb6edcd06765163b4887 Mon Sep 17 00:00:00 2001 From: ava1on Date: Sun, 8 May 2016 16:57:29 +0300 Subject: [PATCH 18/21] Refactored Retfofit test class --- .../qatools/school/apitests/RetrofitAPITests.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java index a4401b9..3b6e40e 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITests.java @@ -1,10 +1,8 @@ package ru.qatools.school.apitests; import org.apache.http.HttpStatus; -import org.hamcrest.Matchers; import org.junit.BeforeClass; import org.junit.Test; -import retrofit2.Call; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -20,7 +18,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.core.Is.is; +import static org.hamcrest.Matchers.is; import static ru.qatools.school.data.Constants.*; /** @@ -39,8 +37,7 @@ public static void initRetrofit(){ @Title("Должны получить заданное в параметре количество городов в ответе") public void shouldReturnRequestedNumberOfCities() throws IOException{ Cities cities = retrofit.create(Cities.class); - Call> request= cities.citiesList(LIMIT_VALUE); - Response> response = request.execute(); + Response> response = cities.citiesList(LIMIT_VALUE).execute(); assertThat("Код ответа неверный", response.code(), is(HttpStatus.SC_OK)); assertThat("Неверное количество городов в ответе", response.body(), hasSize(LIMIT_VALUE)); } @@ -49,11 +46,10 @@ public void shouldReturnRequestedNumberOfCities() throws IOException{ @Title("Значение температуры по шкале Фаренгейта должно соответствовать значению по шкале Цельсия") public void shouldReturnCompatibleTemperatureValuesForCelsiusAndFahrenheit() throws IOException{ Weather weather = retrofit.create(Weather.class); - Call request = weather.weather(CITY_PARAMETER, null); - Response response = request.execute(); + Response response = weather.weather(CITY_PARAMETER, null).execute(); assertThat("Код ответа неверный", response.code(), is(HttpStatus.SC_OK)); assertThat("Значение температуры не правильно переведено из шкалы Цельсия в шкалу Фаренгейта", response.body().getTemperatures()[2].getValue(), - Matchers.is(closeTo(response.body().recalculateCelsiusToFahrenheit(), TEMPERATURE_ERROR))); + is(closeTo(response.body().recalculateCelsiusToFahrenheit(), TEMPERATURE_ERROR))); } -} +} \ No newline at end of file From 8189592f45c8cf78117110792bc5981792a1b385 Mon Sep 17 00:00:00 2001 From: ava1on Date: Tue, 17 May 2016 22:30:04 +0300 Subject: [PATCH 19/21] Adding getFirstWidget method --- .../school/webtests/WeatherWebTest.java | 59 ++++++++++--------- .../school/steps/websteps/DefaultSteps.java | 3 +- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index 6b2bc1d..08c69ab 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -9,6 +9,7 @@ import org.junit.runner.RunWith; import ru.qatools.school.data.DataPatterns; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.WeatherWidget; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.qatools.school.tp.TPInformerRule; @@ -59,7 +60,7 @@ public void initSteps() { } @Test - @TestCaseId("6") + //@TestCaseId("6") @Title("Должны видеть только кнопку [+] ") public void shouldSeeOnlyAddWidgetButton(){ defaultSteps.openMainPageWithoutParameters(); @@ -68,15 +69,15 @@ public void shouldSeeOnlyAddWidgetButton(){ } @Test - @TestCaseId("2") + //@TestCaseId("2") @Title("Должны видеть виджет на главной странице") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0)); + defaultSteps.shouldSee(getFirstWidget()); } @Test - @TestCaseId("8") + //@TestCaseId("8") @Title("В заголовке виджета должны видеть город, указанный в запросе") public void shouldSeeSelectedCityOnWidgetTitle() { defaultSteps.openMainPageWithCity(MOSCOW); @@ -84,7 +85,7 @@ public void shouldSeeSelectedCityOnWidgetTitle() { } @Test - @TestCaseId("16") + //@TestCaseId("16") @Title("Должны видеть новый виджет при открытии страницы без параметров") public void shouldSeeNewWidgetOnMainPageWithoutParameters() { defaultSteps.openMainPageWithCity(""); @@ -92,7 +93,7 @@ public void shouldSeeNewWidgetOnMainPageWithoutParameters() { } @Test - @TestCaseId("3") + //@TestCaseId("3") @Title("Должны видеть на один виджет больше после нажатия на кнопку [+]") public void shouldSeeOneMoreWidget() { defaultSteps.openMainPageWithCity(MOSCOW); @@ -102,81 +103,81 @@ public void shouldSeeOneMoreWidget() { } @Test - @TestCaseId("5") + //@TestCaseId("5") @Title("Должны видеть на один виджет меньше после нажатия на кнопку [-]") public void shouldSeeLessWidgets(){ defaultSteps.openMainPageWithCity(MOSCOW); int numberOfWidgets = onMainPage().getWeatherWidgets().size(); - defaultSteps.clickOn(onMainPage().getWeatherWidgets().get(0).getRemoveWidgetButton()); + defaultSteps.clickOn(getFirstWidget().getRemoveWidgetButton()); defaultSteps.shouldHaveWidgetNumberOnMainPage(numberOfWidgets-1); } @Test - @TestCaseId("9") + //@TestCaseId("9") @Title("Должны видеть время и дату в формате \"Ч AM/PM, дд ммм гг\"") public void shouldSeeDateAndTime(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldMatchPattern(onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getCurrentTime(), DataPatterns.TIME_DATE); + defaultSteps.shouldMatchPattern(getFirstWidget().getWidgetTitle().getCurrentTime(), DataPatterns.TIME_DATE); } @Test - @TestCaseId("11") + //@TestCaseId("11") @Title("Должны видеть новое название города после изменения") public void shouldSeeNewCityAfterChangeUsingEnterKey(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.changeWidgetTitle(onMainPage().getWeatherWidgets().get(0), SPB); + defaultSteps.changeWidgetTitle(getFirstWidget(), SPB); defaultSteps.shouldSeeCityInWidgetsTitle(SPB); } @Test - @TestCaseId("12") + //@TestCaseId("12") @Title("Должны видеть список автозаполнения") public void shouldSeeSuggestCitiesList(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.suggestList(PART_OF_CITYNAME, onMainPage().getWeatherWidgets().get(0).getWidgetTitle()); - defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getSuggestedCitiesList()); + defaultSteps.suggestList(PART_OF_CITYNAME, getFirstWidget().getWidgetTitle()); + defaultSteps.shouldSee(getFirstWidget().getWidgetTitle().getSuggestedCitiesList()); } @Test - @TestCaseId("13") + //@TestCaseId("13") @Title("В списке автозаполнения должны отображаться только города, содержащие введенную строку") public void shouldSeeSuitableSuggestedCities(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.suggestList(PART_OF_CITYNAME, onMainPage().getWeatherWidgets().get(0).getWidgetTitle()); + defaultSteps.suggestList(PART_OF_CITYNAME, getFirstWidget().getWidgetTitle()); defaultSteps.shouldOnlySeeCitiesContaining(PART_OF_CITYNAME); } @Test - @TestCaseId("14") + //@TestCaseId("14") @Title("Должны изменить город используя список автозаполения") public void shouldSeeNewCityAfterChangeUsingSuggestedList(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.suggestList(PART_OF_CITYNAME, onMainPage().getWeatherWidgets().get(0).getWidgetTitle()); + defaultSteps.suggestList(PART_OF_CITYNAME, getFirstWidget().getWidgetTitle()); defaultSteps.selectItemFromSuggestedList(SPB); defaultSteps.shouldSeeCityInWidgetsTitle(SPB); } @Test @UseDataProvider("temperatureFormat") - @TestCaseId("4") + //@TestCaseId("4") @Title("Температура должна отображатся в правильном формате") public void shouldSeeTemperature(int numberOfClicks, DataPatterns pattern) { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.clickOnSeveralTimes(onMainPage().getWeatherWidgets().get(0).getWidgetText().getTemperature(), numberOfClicks); - defaultSteps.shouldMatchPattern(onMainPage().getWeatherWidgets().get(0).getWidgetText().getTemperature(), pattern); + defaultSteps.clickOnSeveralTimes(getFirstWidget().getWidgetText().getTemperature(), numberOfClicks); + defaultSteps.shouldMatchPattern(getFirstWidget().getWidgetText().getTemperature(), pattern); } @Test @UseDataProvider("weatherDataFormat") - @TestCaseId("7") + //@TestCaseId("7") @Title("Погодные данные должны отображаться в правильном формате") public void shouldSeeWeatherData(int id, DataPatterns pattern) { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldMatchPattern(onMainPage().getWeatherWidgets().get(0).getWidgetText().getWeatherData().get(id), pattern); + defaultSteps.shouldMatchPattern(getFirstWidget().getWidgetText().getWeatherData().get(id), pattern); } @Test - @TestCaseId("10") + //@TestCaseId("10") @Title("Должны видеть заголовок страницы") public void shouldSeePageTitle(){ defaultSteps.openMainPageWithoutParameters(); @@ -184,14 +185,18 @@ public void shouldSeePageTitle(){ } @Test - @TestCaseId("23") + //@TestCaseId("23") @Title("Должны видеть иконку погоды") public void shouldSeeWeatherImage(){ defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0).getWidgetText().getWeatherImage()); + defaultSteps.shouldSee(getFirstWidget().getWidgetText().getWeatherImage()); } private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } + + private WeatherWidget getFirstWidget() { + return onMainPage().getWeatherWidgets().get(0); + } } \ No newline at end of file diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 66b2553..64f3269 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -120,8 +120,9 @@ public void clickOnSeveralTimes(HtmlElement element, int times){ private HtmlElement findElementByName(String item, List list){ for(HtmlElement elem : list) - if(elem.getText().equals(item)) + if(elem.getText().equals(item)) { return elem; + } return null; } } From a87f50e0b136d591cd72575ec84881a615e827a0 Mon Sep 17 00:00:00 2001 From: ava1on Date: Tue, 17 May 2016 23:00:52 +0300 Subject: [PATCH 20/21] Adding DbClientRule --- .../ru/qatools/school/apitests/DbAPITest.java | 12 ++++---- .../school/webtests/WeatherWebTest.java | 30 +++++++++---------- .../ru/qatools/school/rules/dbClientRule.java | 24 +++++++++++++++ 3 files changed, 45 insertions(+), 21 deletions(-) create mode 100644 dbclient-module/src/main/java/ru/qatools/school/rules/dbClientRule.java diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java index 7a01fd9..1ec7df2 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/DbAPITest.java @@ -3,8 +3,10 @@ import org.apache.http.HttpStatus; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import ru.qatools.school.DbClient; +import ru.qatools.school.rules.DbClientRule; import ru.yandex.qatools.allure.annotations.Title; import java.util.List; @@ -20,14 +22,12 @@ public class DbAPITest { private DbClient dbClient; + @Rule + public DbClientRule dbClientRule = new DbClientRule(); + @Before public void setupDbConnection(){ - dbClient = new DbClient(); - } - - @After - public void closeDbConnection(){ - dbClient.close(); + dbClient = dbClientRule.getDbClient(); } @Test diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index 08c69ab..a36cc5a 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -60,7 +60,7 @@ public void initSteps() { } @Test - //@TestCaseId("6") + @TestCaseId("6") @Title("Должны видеть только кнопку [+] ") public void shouldSeeOnlyAddWidgetButton(){ defaultSteps.openMainPageWithoutParameters(); @@ -69,7 +69,7 @@ public void shouldSeeOnlyAddWidgetButton(){ } @Test - //@TestCaseId("2") + @TestCaseId("2") @Title("Должны видеть виджет на главной странице") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); @@ -77,7 +77,7 @@ public void shouldSeeWidgetOnMainPage() { } @Test - //@TestCaseId("8") + @TestCaseId("8") @Title("В заголовке виджета должны видеть город, указанный в запросе") public void shouldSeeSelectedCityOnWidgetTitle() { defaultSteps.openMainPageWithCity(MOSCOW); @@ -85,7 +85,7 @@ public void shouldSeeSelectedCityOnWidgetTitle() { } @Test - //@TestCaseId("16") + @TestCaseId("16") @Title("Должны видеть новый виджет при открытии страницы без параметров") public void shouldSeeNewWidgetOnMainPageWithoutParameters() { defaultSteps.openMainPageWithCity(""); @@ -93,7 +93,7 @@ public void shouldSeeNewWidgetOnMainPageWithoutParameters() { } @Test - //@TestCaseId("3") + @TestCaseId("3") @Title("Должны видеть на один виджет больше после нажатия на кнопку [+]") public void shouldSeeOneMoreWidget() { defaultSteps.openMainPageWithCity(MOSCOW); @@ -103,7 +103,7 @@ public void shouldSeeOneMoreWidget() { } @Test - //@TestCaseId("5") + @TestCaseId("5") @Title("Должны видеть на один виджет меньше после нажатия на кнопку [-]") public void shouldSeeLessWidgets(){ defaultSteps.openMainPageWithCity(MOSCOW); @@ -113,7 +113,7 @@ public void shouldSeeLessWidgets(){ } @Test - //@TestCaseId("9") + @TestCaseId("9") @Title("Должны видеть время и дату в формате \"Ч AM/PM, дд ммм гг\"") public void shouldSeeDateAndTime(){ defaultSteps.openMainPageWithCity(MOSCOW); @@ -121,7 +121,7 @@ public void shouldSeeDateAndTime(){ } @Test - //@TestCaseId("11") + @TestCaseId("11") @Title("Должны видеть новое название города после изменения") public void shouldSeeNewCityAfterChangeUsingEnterKey(){ defaultSteps.openMainPageWithCity(MOSCOW); @@ -130,7 +130,7 @@ public void shouldSeeNewCityAfterChangeUsingEnterKey(){ } @Test - //@TestCaseId("12") + @TestCaseId("12") @Title("Должны видеть список автозаполнения") public void shouldSeeSuggestCitiesList(){ defaultSteps.openMainPageWithCity(MOSCOW); @@ -139,7 +139,7 @@ public void shouldSeeSuggestCitiesList(){ } @Test - //@TestCaseId("13") + @TestCaseId("13") @Title("В списке автозаполнения должны отображаться только города, содержащие введенную строку") public void shouldSeeSuitableSuggestedCities(){ defaultSteps.openMainPageWithCity(MOSCOW); @@ -148,7 +148,7 @@ public void shouldSeeSuitableSuggestedCities(){ } @Test - //@TestCaseId("14") + @TestCaseId("14") @Title("Должны изменить город используя список автозаполения") public void shouldSeeNewCityAfterChangeUsingSuggestedList(){ defaultSteps.openMainPageWithCity(MOSCOW); @@ -159,7 +159,7 @@ public void shouldSeeNewCityAfterChangeUsingSuggestedList(){ @Test @UseDataProvider("temperatureFormat") - //@TestCaseId("4") + @TestCaseId("4") @Title("Температура должна отображатся в правильном формате") public void shouldSeeTemperature(int numberOfClicks, DataPatterns pattern) { defaultSteps.openMainPageWithCity(MOSCOW); @@ -169,7 +169,7 @@ public void shouldSeeTemperature(int numberOfClicks, DataPatterns pattern) { @Test @UseDataProvider("weatherDataFormat") - //@TestCaseId("7") + @TestCaseId("7") @Title("Погодные данные должны отображаться в правильном формате") public void shouldSeeWeatherData(int id, DataPatterns pattern) { defaultSteps.openMainPageWithCity(MOSCOW); @@ -177,7 +177,7 @@ public void shouldSeeWeatherData(int id, DataPatterns pattern) { } @Test - //@TestCaseId("10") + @TestCaseId("10") @Title("Должны видеть заголовок страницы") public void shouldSeePageTitle(){ defaultSteps.openMainPageWithoutParameters(); @@ -185,7 +185,7 @@ public void shouldSeePageTitle(){ } @Test - //@TestCaseId("23") + @TestCaseId("23") @Title("Должны видеть иконку погоды") public void shouldSeeWeatherImage(){ defaultSteps.openMainPageWithCity(MOSCOW); diff --git a/dbclient-module/src/main/java/ru/qatools/school/rules/dbClientRule.java b/dbclient-module/src/main/java/ru/qatools/school/rules/dbClientRule.java new file mode 100644 index 0000000..5565e17 --- /dev/null +++ b/dbclient-module/src/main/java/ru/qatools/school/rules/dbClientRule.java @@ -0,0 +1,24 @@ +package ru.qatools.school.rules; + +import org.junit.rules.ExternalResource; +import ru.qatools.school.DbClient; + +/** + * @author ava1on + */ +public class DbClientRule extends ExternalResource { + + private DbClient dbClient; + + public void before(){ + this.dbClient = new DbClient(); + } + + public void after(){ + dbClient.close(); + } + + public DbClient getDbClient(){ + return dbClient; + } +} From b3b3b5b5edf67f67938f9412d6da8709e2126f40 Mon Sep 17 00:00:00 2001 From: ava1on Date: Wed, 18 May 2016 00:35:08 +0300 Subject: [PATCH 21/21] Optimizing POM files for all modules --- api-tests-module/pom.xml | 3 --- commons-module/pom.xml | 2 -- pom.xml | 12 ------------ steps-module/pom.xml | 2 -- 4 files changed, 19 deletions(-) diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml index 76442e0..cbede40 100644 --- a/api-tests-module/pom.xml +++ b/api-tests-module/pom.xml @@ -27,7 +27,6 @@ com.google.code.gson gson 2.6.2 - test com.squareup.retrofit2 @@ -37,12 +36,10 @@ org.hamcrest hamcrest-all - 1.3 ru.yandex.qatools.allure allure-junit-adaptor - 1.4.23 ru.qatools.school diff --git a/commons-module/pom.xml b/commons-module/pom.xml index 97cb03e..13c90d9 100644 --- a/commons-module/pom.xml +++ b/commons-module/pom.xml @@ -29,8 +29,6 @@ com.tngtech.java junit-dataprovider - 1.10.4 - test diff --git a/pom.xml b/pom.xml index d11abe3..bd58953 100644 --- a/pom.xml +++ b/pom.xml @@ -44,14 +44,12 @@ - com.jayway.restassured rest-assured 2.9.0 - ru.yandex.qatools.allure allure-junit-adaptor @@ -82,16 +80,6 @@ htmlelements-matchers 1.12 - - org.cthul - cthul-matchers - 1.1.0 - - - ru.yandex.qatools.matchers - webdriver-matchers - 1.3 - diff --git a/steps-module/pom.xml b/steps-module/pom.xml index cf2339d..cb8a2be 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -40,12 +40,10 @@ ru.yandex.qatools.htmlelements htmlelements-matchers - com.jayway.restassured rest-assured - org.cthul cthul-matchers