测试人员的 SOLID 原则:依赖性倒置原则

2024-09-01   出处: thinkingtester  作/译者:kristinjackvony / Mint

现在是介绍最后一个SOLID原则的时候了!依赖性倒置原则由两部分组成,我们将逐一进行介绍。首先,该原则指出“高级模块不应该依赖于低级模块,而应该依赖于抽象。”

为了理解这一点,我们首先需要知道“高级模块”和“低级模块”之间的区别。“低级模块”是处理特定任务的模块,例如从数据库发出请求或将文件发送到打印机。在这篇文章的第一个例子中,我们将使用一个名为“AddText”的类,它将清除一个文本字段并在其中输入新的文本:

class AddText {
    clearAndEnterText(id: string, value: string) {
        driver.findElement(By.id(id)).clear().sendKeys(value)
    }
}

“高级模块”是指为应用程序或测试提供核心功能的东西,例如生成报告或创建新用户。在这个例子中,我们将使用一个名为“UpdatePerson”的类来更新Person记录中的值:

class UpdatePerson {
    private addText: AddText
    constructor(addText: AddText) {
        this.addText = addText
    }
    update(updateId: string, updateValue: string) {
        this.addText.clearAndEnterText(updateId, updateValue)
    }
}

在这个例子中,我们更新记录的方法是首先初始化一个 AddText 类的实例,然后初始化一个 UpdatePerson 类的实例,再调用update函数进行更新:

const addText = new AddText()
const updateUser = new UpdatePerson(addText)
updateUser.update('lastName', 'Smith')

但是这个例子违反了依赖性倒置原则!UpdatePerson类非常依赖于AddText类。如果在“AddText”类中的“clearAndEnterText”函数的签名(参数和返回类型)发生变化,那么“UpdatePerson”类也必须相应地改变。

因此,让我们按照原则更新代码。我们将创建一个名为“AddText”的接口,而不是创建一个“AddText”类:

interface AddText {
  clearAndEnterText(id: string, value, string): void
}

然后创建一个名为“PersonForm”的类,来实现这个接口:

class PersonForm implements AddText {
    clearAndEnterText(id: string, value: string) {
        driver.findElement(By.id(id)).clear().sendKeys(value)
    }
}

最后,更新UpdatePerson类,让它使用PersonForm:

class UpdatePerson {
    private form: PersonForm
    constructor(form: PersonForm) {
        this.form = form
    }
    update(updateId: string, updatevalue: string) {
        this.form.clearAndEnterText(updateId, updateValue)
    }
}

现在,我们可以通过先创建“PersonForm”类的实例,再创建并使用“UpdatePerson”类来更新Person的值:

const userForm = new PersonForm()
const updateUser = newUpdatePerson(userForm)
updateUser.update('lastname', 'Smith')

现在,PersonForm类和UpdatePerson类都依赖于接口,而不是低级模块。如果“clearAndEnterText”接口的签名发生了变化,我们需要更新PersonForm类,但是不需要对UpdatePerson类进行更改。

依赖性倒置原则的第二部分指出:“抽象不应该依赖于细节;但细节应该依赖于抽象”。抽象是指的是一个接口或抽象类,它定义了一组行为,但不提供具体的实现。无论是高层模块还是低层模块都应该依赖于抽象,如果它们的实现细节发生了变化,也不应该影响抽象。

换句话说,PersonForm类可以对“clearAndEnterText”函数进行任何更改,但它不会对“AddText”接口产生任何影响。例如,我们可以更改PersonForm类,使它包含一条日志语句,但这不会对“AddText”接口产生任何影响:

class PersonForm implements AddText {
    clearAndEnterText(id: string, value: string) {
        driver.findElement(By.id(id)).clear().sendKeys(value)
        console.log('Element updated')
    }
}

以上就是我对SOLID原则的五篇系列文章的总结!在这个过程中我确实学到了很多,我希望这些使用软件测试中常见方法的简单示例对你有所帮助!


声明:本文为本站编辑转载,文章版权归原作者所有。文章内容为作者个人观点,本站只提供转载参考(依行业惯例严格标明出处和作译者),目的在于传递更多专业信息,普惠测试相关从业者,开源分享,推动行业交流和进步。 如涉及作品内容、版权和其它问题,请原作者及时与本站联系(QQ:1017718740),我们将第一时间进行处理。本站拥有对此声明的最终解释权!欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,与我们的编辑和其他窝友交流。
128° /1281 人阅读/0 条评论 发表评论

登录 后发表评论