Behaviour Driven Development BDD Logging

Learn the BELLATRIX Behaviour Driven Development BDD Logging works and how to use it.

Example

[Test]
public void PurchaseRocketWithLogs()
{
    App.Navigation.Navigate("http://demos.bellatrix.solutions/");

    Select sortDropDown = App.Components.CreateByNameEndingWith<Select>("orderby");
    Anchor protonMReadMoreButton = App.Components.CreateByInnerTextContaining<Anchor>("Read more");
    Anchor addToCartFalcon9 = 
    App.Components.CreateByAttributesContaining<Anchor>("data-product_id", "28").ToBeClickable();
    Anchor viewCartButton = 
    App.Components.CreateByClassContaining<Anchor>("added_to_cart wc-forward").ToBeClickable();

    sortDropDown.SelectByText("Sort by price: low to high");
    protonMReadMoreButton.Hover();
    addToCartFalcon9.Focus();
    addToCartFalcon9.Click();
    viewCartButton.Click();

    TextField couponCodeTextField = App.Components.CreateById<TextField>("coupon_code");
    Button applyCouponButton = App.Components.CreateByValueContaining<Button>("Apply coupon");
    Div messageAlert = App.Components.CreateByClassContaining<Div>("woocommerce-message");
    Number quantityBox = App.Components.CreateByClassContaining<Number>("input-text qty text");
    Button updateCart = App.Components.CreateByValueContaining<Button>("Update cart").ToBeClickable();
    Span totalSpan = App.Components.CreateByXpath<Span>("//*[@class='order-total']//span");
    Anchor proceedToCheckout = 
    App.Components.CreateByClassContaining<Anchor>("checkout-button button alt wc-forward");

    couponCodeTextField.SetText("happybirthday");
    applyCouponButton.Click();
    messageAlert.ToHasContent().ToBeVisible().WaitToBe();
    messageAlert.ValidateInnerTextIs("Coupon code applied successfully.");
    quantityBox.SetNumber(0);
    quantityBox.SetNumber(2);
    updateCart.Click();
    totalSpan.ValidateInnerTextIs("95.00€", 15000);
    proceedToCheckout.Click();

    Heading billingDetailsHeading = App.Components.CreateByInnerTextContaining<Heading>("Billing details");
    Anchor showLogin = App.Components.CreateByInnerTextContaining<Anchor>("Click here to login");
    TextArea orderCommentsTextArea = App.Components.CreateById<TextArea>("order_comments");
    TextField billingFirstName = App.Components.CreateById<TextField>("billing_first_name");
    TextField billingLastName = App.Components.CreateById<TextField>("billing_last_name");
    TextField billingCompany = App.Components.CreateById<TextField>("billing_company");
    Select billingCountry = App.Components.CreateById<Select>("billing_country");
    TextField billingAddress1 = App.Components.CreateById<TextField>("billing_address_1");
    TextField billingAddress2 = App.Components.CreateById<TextField>("billing_address_2");
    TextField billingCity = App.Components.CreateById<TextField>("billing_city");
    Select billingState = App.Components.CreateById<Select>("billing_state").ToBeVisible().ToBeClickable();
    TextField billingZip = App.Components.CreateById<TextField>("billing_postcode");
    Phone billingPhone = App.Components.CreateById<Phone>("billing_phone");
    Email billingEmail = App.Components.CreateById<Email>("billing_email");
    CheckBox createAccountCheckBox = App.Components.CreateById<CheckBox>("createaccount");
    RadioButton checkPaymentsRadioButton = 
	App.Components.CreateByAttributesContaining<RadioButton>("for", "payment_method_cheque");

    billingDetailsHeading.ToBeVisible().WaitToBe();
    showLogin.ValidateHrefIs("http://demos.bellatrix.solutions/checkout/#");
    showLogin.ValidateCssClassIs("showlogin");
    orderCommentsTextArea.ScrollToVisible();
    orderCommentsTextArea.SetText("Please send the rocket to my door step!");
    billingFirstName.SetText("In");
    billingLastName.SetText("Deepthought");
    billingCompany.SetText("Automate The Planet Ltd.");
    billingCountry.SelectByText("Bulgaria");
    billingAddress1.ValidatePlaceholderIs("House number and street name");
    billingAddress1.SetText("bul. Yerusalim 5");
    billingAddress2.SetText("bul. Yerusalim 6");
    billingCity.SetText("Sofia");
    billingState.SelectByText("Sofia-Grad");
    billingZip.SetText("1000");
    billingPhone.SetPhone("+00359894646464");
    billingEmail.SetEmail("info@bellatrix.solutions");
    createAccountCheckBox.Check();
    checkPaymentsRadioButton.Click();
}

Explanations

There cases when you need to show your colleagues or managers what tests do you have. Sometimes you may have manual test cases, but their maintenance and up-to-date state are questionable. Also, many times you need additional work to associate the tests with the test cases. Some frameworks give you a way to write human readable tests through the Gherkin language. The main idea is for non-technical people to write these tests. However, we believe this approach is doomed. Or it is doable only for simple tests. This is why in BELLATRIX we built a feature that generates the test cases after the tests execution. After each action or assertion, a new entry is logged.

After the test is executed the following log is created:

>Start Chrome on PORT = 34079
Start Test
Class = BDDLoggingTests Name = PurchaseRocketWithLogs
Select 'Sort by price: low to high' from control (Name ending with orderby)
Hover control (InnerText containing Read more)
Focus control (data-product_id = 28)
Click control (data-product_id = 28)
Click control (Class = added_to_cart wc-forward)
Type 'happybirthday' into control (ID = coupon_code)
Click control (Value containing Apply coupon)
Ensure control (Class = woocommerce-message) inner text is 'Coupon code applied successfully.'
Set '0' into control (Class = input-text qty text)
Set '2' into control (Class = input-text qty text)
Click control (Value containing Update cart)
Ensure control (XPath = //*[@class='order-total']//span) inner text is '95.00€'
Click control (Class = checkout-button button alt wc-forward)
Ensure control (InnerText containing Click here) href is 'http://demos.bellatrix.solutions/checkout/#'
Ensure control (InnerText containing Click here) CSS class is 'showlogin'
Scroll to visible control (ID = order_comments)
Type 'Please send the rocket to my door step!' into control (ID = order_comments)
Type 'In' into control (ID = billing_first_name)
Type 'Deepthought' into control (ID = billing_last_name)
Type 'Automate The Planet Ltd.' into control (ID = billing_company)
Select 'Bulgaria' from control (ID = billing_country)
Ensure control (ID = billing_address_1) placeholder is 'House number and street name'
Type 'bul. Yerusalim 5' into control (ID = billing_address_1)
Type 'bul. Yerusalim 6' into control (ID = billing_address_2)
Type 'Sofia' into control (ID = billing_city)
Select 'Sofia-Grad' from control (ID = billing_state)
Type '1000' into control (ID = billing_postcode)
Type '+00359894646464' into control (ID = billing_phone)
Type 'info@bellatrix.solutions' into control (ID = billing_email)
Check control (ID = createaccount)
Click control (for = payment_method_cheque)

Notice that Ensure assertions are also present in the log: Ensure control (XPath = //[@class=’order-total’]//span) inner text is ‘95.00€’*

There are two specific considerations about the generation of the logs when page objects are used, which are discussed in next chapters:

  1. Instead of locators, the exact names of the element properties are printed.
  2. Instead of page URL, the name of the page is displayed.