如何使用Vue测试库测试应用程序?
时间:2023-03-19 13:29:02
科技观察
.quantity-wrapper{margin:2emauto;宽度:50%;显示:弹性;justify-content:center;}.quantity-wrapperdiv{margin-right:2em;}.quantity-input{margin-left:0.5em;}.quantity-wrapperbutton{margin-right:1em;}button{cursor:pointer;}阅读之前,你应该具备:了解vue相关知识熟悉测试APP的UI按照惯例,在Vue生态中,当你想要测试应用时,可以使用@vue/test-utils-Vue的官方测试库。这个库提供了相关的API供用户测试渲染后的Vue组件实例。例如://example.spec.jsimport{shallowMount}from'@vue/test-utils'importHelloWorldfrom'@/components/HelloWorld.vue'describe('HelloWorld.vue',()=>{it('通过时呈现props.msg',()=>{constmsg='newmessage'constwrapper=shallowMount(HelloWorld,{propsData:{msg}})expect(wrapper.text()).toMatch(msg)})})可以看到我们在项目开发代码中使用了@vue/test-utils库提供的shallowMount函数来加载渲染Vue组件。上述测试Vue组件的方法的问题在于,用户最终在不知道Vue如何呈现UI的情况下与DOM进行交互。相反,一般只能通过页面上的文本内容、输入框的标签以及其他一些可见的视觉线索来判断对应的UI元素是否可见。更好的方法是为您的Vue应用程序编写测试用例,以反映真实用户如何与之交互,例如在结帐页面中寻找增加购买产品数量的按钮,因此需要Vue测试库。什么是Vue测试库?Vue测试库是Vue的轻量级测试库,提供基于@vue/test-utils的轻量级实用函数。它是根据一个简单的指导原则创建的:您的测试与软件的使用方式越相似,它们给您的信心就越大。—testing-library.com为什么要使用Vue测试库?你想写的测试用例不需要你需要关注实现细节,即测试方法是如何实现的,而不是它是否产生了预期的结果。你想针对实际的DOM节点编写测试,而不是渲染的Vue组件。您想要编写以与用户相同的方式查询DOM的测试。Vue测试库如何工作Vue测试库通过提供查询DOM的功能来工作,就像用户与之交互的方式一样。这些有用的函数允许您通过标签文本查找元素,从它们的文本内容中查找链接和按钮,并断言对Vue应用程序的完全访问。对于无法通过文本内容或标签查找元素或其他不切实际的情况,Vue测试库提供了一种推荐的方法,通过使用data-testid属性作为标签来查找这些元素。data-testd属性被添加到您计划在测试中查询的HTML元素。比如CheckOut开始使用Vue测试库既然你明白了为什么要使用Vue测试库以及它是如何工作的,那么让我们在新的Vue中创建一个Vue项目CLI配置在.首先,我们将通过在终端中运行以下命令来创建一个新项目(假设您的机器上安装了VueCLI)vuecreatevue-testing-library-demo为了运行测试,我们将使用Jest,它是由Facebook测试运行器开发。VueCLI有一个插件可以轻松配置Jest。我们来添加这个插件:vueaddunit-jest添加完成后,你会发现在package.json中添加了一个新的脚本:"test:unit":"vue-cli-servicetest:unit",这个脚本用于运行测试用例。它还在src中添加了一个新的测试文件夹,并在测试文件夹中添加了一个单元文件夹,其中包含一个名为example.spec.js的示例测试文件。基于Jest的配置,当我们运行npmruntest:unit时,Jest会在tests目录中查找文件并运行测试文件。让我们运行示例测试文件:npmruntest:unit这应该运行test/unit目录中的example.spec.js测试文件。让我们看看这个文件的内容。import{shallowMount}from'@vue/test-utils'importHelloWorldfrom'@/components/HelloWorld.vue'describe('HelloWorld.vue',()=>{it('rendersprops.msgwhenpassed',()=>{constmsg='newmessage'constwrapper=shallowMount(HelloWorld,{propsData:{msg}})expect(wrapper.text()).toMatch(msg)})})默认情况下,使用VueCLI插件安装Jest会安装@vue/test-utils,所以上面的测试文件使用了@vue/test-utils中的showMount函数。但是我们想使用Vue测试库而不是@vue/test-utils。为此,我们将卸载@vue/test-utils因为我们不需要它。npmuninstall@vue/test-utils--save-dev然后,我们安装Vue测试库npminstall@testing-library/vue--save-dev接下来,我们修改tests/unit/example.spec.js为:import{render}from'@testing-library/vue'importHelloWorldfrom'@/components/HelloWorld.vue'describe('HelloWorld.vue',()=>{it('rendersprops.msgwhenpassed',()=>{constmsg='newmessage'const{getByText}=render(HelloWorld,{props:{msg}})getByText(msg)})})再次运行测试,它应该通过。让我们看看我们做了什么:我们使用Vue测试库公开的渲染函数来渲染HelloWorld组件。render是渲染Vue组件的唯一方式。调用render时,需要传入Vue组件和一个可选的options对象。然后,我们使用选项对象来传递HelloWorld组件所需的参数。render将返回一个带有辅助方法的对象来查询DOM,其中一个方法是getByText。最后,我们使用getByText断言DOM中是否存在带有“新消息”文本内容的元素。到目前为止,您可能已经注意到从考虑测试渲染的Vue组件到用户在DOM中看到的内容的转变。这种转变将允许您从用户的角度来测试您的应用程序,而不是专注于实现细节。我们的演示应用程序现在我们已经确定了如何使用Vue测试库在Vue中完成测试,我们将继续测试演示应用程序。但首先,我们将充实应用程序的用户界面。我们的演示应用程序是一个简单的产品结帐页面。我们会测试用户是否可以在结账前增加商品的数量,是否可以看到商品名称和价格等,让我们开始吧。首先,在components/目录中创建一个名为checkout的新Vue组件,并向其中添加以下代码段:{{product.name}}-${{product.price}}
数量
最终价格-${{finalPrice}}
.quantity-wrapper{margin:2emauto;宽度:50%;显示:弹性;justify-content:center;}.quantity-wrapperdiv{margin-right:2em;}.quantity-input{margin-left:0.5em;}.quantity-wrapperbutton{margin-right:1em;}button{cursor:pointer;}再将App.vue修改:
对于我们的测试用例,我们将测试以下场景:用户能否看到产品名称?用户可以看到产品价格吗?用户能否增加产品数量?用户可以减少产品数量吗?随着数量的变化,用户能否实时看到更新的总价?我们的UI界面非常简单,因为重点是如何使用Vue测试库进行测试。让我们继续测试Checkout组件。在tests/unit/中创建一个名为checkout.spec.js的新测试文件,其内容如下:import{render,fireEvent}from'@testing-library/vue'importCheckOutfrom'@/components/CheckOut.vue'const={name:'KorgKronos',price:1200}describe('Checkout.vue',()=>{//testsgoeshere})我们的第一个测试用例将检查产品名称是否正确显示。我们将这样做:it('rendersproductname',()=>{const{getByText}=render(CheckOut,{props:{product}})getByText(product.name)})然后,我们将检查产品price是否正常显示:it('rendersproductprice',()=>{const{getByText}=render(CheckOut,{props:{product}})getByText("$"+product.price)})Continue为了测试Checkout组件,我们将使用getByDisplayValue辅助方法来测试用户看到的初始数量是否为1:it('rendersinitialquantityas1',()=>{const{getByDisplayValue,getByText}=render(CheckOut,{props:{product}})getByDisplayValue(1)})接下来,我们将检查当用户点击按钮增加产品数量时,产品数量是否增加。为此,我们将使用Vue测试库中的fireEvent实用程序来触发点击事件。这是完整的实现it('incrementsproductquantity',async()=>{const{getByDisplayValue,getByText}=render(CheckOut,{props:{product}})constincrementQuantityButton=getByText('+')awaitfireEvent.click(incrementQuantityButton)getByDisplayValue(2)})我们在数量为1时执行相同的递减-在这种情况下我们不递减数量。当数量为2时,我们写两个测试用例。it('当数量为1时不减少数量',async()=>{const{getByDisplayValue,getByText}=render(CheckOut,{props:{product}})constdecrementQuantityButton=getByText('-')awaitfireEvent.click(decrementQuantityButton)getByDisplayValue(1)})it('当数量大于1时减少数量',async()=>{const{getByDisplayValue,getByText}=render(CheckOut,{props:{product}})constincrementQuantityButton=getByText('+')constdecrementQuantityButton=getByText('-')awaitfireEvent.click(incrementQuantityButton)awaitfireEvent.click(decrementQuantityButton)getByDisplayValue(1)})最后我们测试一下是否可以点击数量增减查看最终价格是否正常显示给用户。在整个测试用例中,您会注意到我们更专注于根据用户可以看到的内容编写测试并与他们的眼睛进行交互。以这种方式编写测试可确保我们正在测试对应用程序用户来说很重要的事情。最后,本文介绍了一个用于测试Vue应用程序的库和方法,称为Vue测试库,我们将了解如何设置它以及如何使用它为Vue组件编写测试用例。您可以在GitHub上找到演示项目https://github.com/DominusKelvin/vue-testing-library-demo*原文链接:https://www.smashingmagazine.com/2020/11/vue-applications-vue-testing-图书馆/