当前位置:首页 > 开发教程 > .net教程 >

高级编程研究设计模式自动化测试第一部分

时间:2016-05-23 10:00 来源:互联网 作者:源码搜藏 收藏

UML类图 参与者 参与的类和对象 我 mproved 行为研究设计P attern 是: IBehaviou - [R -定义为所有行为的接口。只包含一个 执行 方法。 AssertBehaviour -所有只断言行为的基类。包含两个方法- 断言 和 执行 。 ActionBehaviour -一切行动只行为的基类。只

UML类图

高级编程研究设计模式自动化测试第一部分

参与者

参与的类和对象mproved 行为研究设计P attern是:

  • IBehaviou - [R -定义为所有行为的接口。只包含一个执行方法。
  • AssertBehaviour -所有只断言行为的基类。包含两个方法- 断言执行。 
  • ActionBehaviour -一切行动只行为的基类。只包含两个方法PerformAct执行。 
  • WaitableActionBehaviour -为可以同时包含行动,声称等待所有的逻辑更复杂的行为基类。 
  • UnityContainerFactory -创建并保持一个单一的全球实例为Unity IoC容器类。
  • ItemPageNavigationBehaviour -为ItemPage类的具体行为。它拥有一个导航逻辑。它是一个行动的行为。
  • ItemPage -一个具体的网页对象,它提供了可以在页面上进行不同的服务操作。它是在特定的行为使用。
  • BehaviourExecutor -它是执行行为'的工作流的列表中的类。

什么是我们尝试解决问题?

在前面的例子中,有一个主要问题,这是不能适当的参数传递到的行为。它们都依赖于一个静态的测试上下文类。正如你可能知道的,静态的使用是不是最好的做法。在我看到的另一个问题是,工作流的定义中ExecutionEngine是有点不灵活。如果需要添加一个新的步骤,要适用于几乎所有的测试依赖于主类的变化。我想提高测试的灵活性。

行为研究设计模式C#代码

之一相比前述实施例的主要区别在于,IBehaviour接口只包含一个于方法执行

IBehaviour接口更改

 
public interface IBehaviour
  {
  void Execute();
  }
查看原始IBehaviour.cs主办的GitHub

另一个主要区别是,有基础上,他们需要在行为设计图案的该变化来解决使用案例多个基行为类。有一个动作的,并且断言,只有类。我相信,这会导致更好的面向对象设计,而不是仅重写所提供的方法的一部分。

操作只基类

 
public abstract class ActionBehaviour : IBehaviour
  {
  public void Execute()
  {
  this.PerformAct();
  }
   
  protected abstract void PerformAct();
  }
查看原始ActionBehaviour.cs主办的GitHub

断言只有基类

 
public abstract class AssertBehaviour : IBehaviour
  {
  public void Execute()
  {
  this.Assert();
  }
   
  protected abstract void Assert();
  }
查看原始AssertBehaviour.cs主办的GitHub

可等待行动基地班

 
public abstract class WaitableActionBehaviour : IBehaviour
  {
  public void Execute()
  {
  this.PerformAct();
  this.PerformPostActWait();
  }
   
  protected abstract void PerformAct();
   
  protected abstract void PerformPostActWait();
  }
查看原始WaitableActionBehaviour.cs主办的GitHub

当您需要执行的操作,然后等待的东西,例如,等待页面加载或一个元素成为可见的类是很有用的。

可等待Assertable行动基地班

 
public class WaitableAssertableActionBehaviour : IBehaviour
  {
  public void Execute()
  {
  this.PerformPreActWait();
  this.PerformPreActAssert();
  this.PerformAct();
  this.PerformPostActAssert();
  this.PerformPostActWait();
  this.PerformPostActWaitAssert();
  }
   
  protected virtual void PerformPreActWait()
  {
  }
   
  protected virtual void PerformPreActAssert()
  {
  }
   
  protected virtual void PerformAct()
  {
  }
   
  protected virtual void PerformPostActAssert()
  {
  }
   
  protected virtual void PerformPostActWait()
  {
  }
   
  protected virtual void PerformPostActWaitAssert()
  {
  }
  }
查看原始WaitableAssertableActionBehaviour.cs主办的GitHub

类几乎是相同的,从前述实施例的那些,因为它太复杂,并且包含在它的所有可能的工作流的步骤。建议只有当你无法使用其他一些可用的基本行为的类使用它。

项目页面导航行为重构的

现在的行为接受需要itemUrl作为构造函数的参数。从属ItemPage中未解决的BehavioursExecutor而是在行为本身通过的帮助UnityContainerFactory提供的统一IoC容器的当前实例的类。行为只需要导航到单个页面,因为它实现了简单ActionBehaviour基类。

 
public class ItemPageNavigationBehaviour : ActionBehaviour
  {
  private readonly ItemPage itemPage;
  private readonly string itemUrl;
   
  public ItemPageNavigationBehaviour(string itemUrl)
  {
  this.itemPage = UnityContainerFactory.GetContainer().Resolve<ItemPage>();
  this.itemUrl = itemUrl;
  }
   
  protected override void PerformAct()
  {
  this.itemPage.Navigate(this.itemUrl);
  }
  }
查看原始ItemPageNavigationBehaviour.cs主办的GitHub

UnityContainerFactory

它是一个包含一个静态方法的静态类GetContainer返回统一IOC容器的当前实例。它也可以被实现为

 
public static class UnityContainerFactory
  {
  private static IUnityContainer unityContainer;
   
  static UnityContainerFactory()
  {
  unityContainer = new UnityContainer();
  }
   
  public static IUnityContainer GetContainer()
  {
  return unityContainer;
  }
  }
查看原始UnityContainerFactory.cs主办的GitHub

登录页面登录行为重构的

这些变化是几乎相同的应用到的那些ItemPageNavigationBehaviour除了类继承WaitableActionBehaviour。它覆盖了PerformPostAc TWAIT方法,在那里等待送货地址页面加载。

 
public class SignInPageLoginBehaviour : WaitableActionBehaviour
  {
  private readonly SignInPage signInPage;
  private readonly ShippingAddressPage shippingAddressPage;
  private readonly ClientLoginInfo clientLoginInfo;
   
  public SignInPageLoginBehaviour(ClientLoginInfo clientLoginInfo)
  {
  this.signInPage =
  UnityContainerFactory.GetContainer().Resolve<SignInPage>();
  this.shippingAddressPage =
  UnityContainerFactory.GetContainer().Resolve<ShippingAddressPage>();
  this.clientLoginInfo = clientLoginInfo;
  }
   
  protected override void PerformPostActWait()
  {
  this.shippingAddressPage.WaitForPageToLoad();
  }
   
  protected override void PerformAct()
  {
  this.signInPage.Login(this.clientLoginInfo.Email, this.clientLoginInfo.Password);
  }
  }
查看原始SignInPageLoginBehaviour.cs主办的GitHub

简化BehaviourExecutor

现在并无持有任何复杂的逻辑的执行者,它仅包含一个执行接受的行为“的工作流程的一个阵列的方法。

 
public static class BehaviourExecutor
  {
  public static void Execute(params IBehaviour[] behaviours)
  {
  foreach (var behaviour in behaviours)
  {
  behaviour.Execute();
  }
  }
  }
查看原始BehaviourExecutor.cs主办的GitHub

在行为研究试验设计模式

 
[TestMethod]
  public void Purchase_SimpleBehaviourEngine()
  {
  var itemUrl = "/Selenium-Testing-Cookbook-Gundecha-Unmesh/dp/1849515743";
  var itemPrice = "40.49";
  var clientPurchaseInfo = new ClientPurchaseInfo(
  new ClientAddressInfo()
  {
  FullName = "John Smith",
  Country = "United States",
  Address1 = "950 Avenue of the Americas",
  State = "New York",
  City = "New York City",
  Zip = "10001-2121",
  Phone = "00164644885569"
  });
  clientPurchaseInfo.CouponCode = "99PERDIS";
  var clientLoginInfo = new ClientLoginInfo()
  {
  Email = "g3984159@trbvm.com",
  Password = "ASDFG_12345"
  };
  BehaviourExecutor.Execute(
  new ItemPageNavigationBehaviour(itemUrl),
  new ItemPageBuyBehaviour(),
  new PreviewShoppingCartPageProceedBehaviour(),
  new SignInPageLoginBehaviour(clientLoginInfo),
  new ShippingAddressPageFillShippingBehaviour(clientPurchaseInfo),
  new ShippingAddressPageFillDifferentBillingBehaviour(clientPurchaseInfo),
  new ShippingAddressPageContinueBehaviour(),
  new ShippingPaymentPageContinueBehaviour(),
  new PlaceOrderPageAssertFinalAmountsBehaviour(itemPrice));
  }
查看原始AmazonPurchaseTests.cs主办的GitHub

相比之前的变化,可以发现一些显著的变化。首先,你需要通过传递行为的新的运 营商,并传递任何必需的参数。此前,通过你传递的行为typeof操作符。你不再有义务初始化静态测试环境。我相信这些变化做出的测试更加灵活,可读性和可维护性。


.net教程阅读排行

最新文章