SoftwareTest7 - JUnit 是个啥 ? 他跟 Selenium 有什么关系 ?

news2024/11/15 23:56:48

JUnit 是个啥 ? 他跟 Selenium 有什么关系 ?

  • 一 . 相关注解
    • 1.1 @Test
    • 1.2 @BeforeEach
    • 1.3 @BeforeAll
    • 1.4 @AfterEach
    • 1.5 @AfterAll
  • 二 . 断言
    • 2.1 assertEquals
    • 2.2 assertNotEquals
    • 2.3 assertTrue / assertFalse : 断言结果为真/假
    • 2.4 assertNull / assertNotNull : 断言结果为空 / 不为空
  • 三 . 用例的执行顺序
    • 3.1 通过 Order 注解来排序
  • 四 . 参数化
    • 4.1 单参数注解手动编写数据源
    • 4.2 多参数从 csv 文件获取数据来源
    • 4.3 动态参数方法
  • 五 . 测试套件
    • 5.1 指定类来运行包下所有用例
    • 5.2 指定包来运行包下所有用例

Hello , 大家好 , 又给大家带来新的专栏喽 ~

这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足以让你成为软件测试行业的佼佼者 , 但是可以让你了解一下软件测试行业的相关知识 , 具有一定的竞争实力 .

那这篇文章 , 就开始 Selenium 实战了 , 我们可以通过代码来操控浏览器来去做一些操作了 , 这个过程非常有趣 , 敬请期待

那也欢迎大家订阅此专栏 : https://blog.csdn.net/m0_53117341/category_12427509.html

希望大家都能够拿到好的 Offer
在这里插入图片描述

我们之前讲过 , 自动化不就是通过 selenium 去实现的吗 , 怎么又引入了个 JUnit 呢 ?
JUnit 是 Java 中的单元测试工具 , 但是我们可以借用 JUnit 库中一些非常好的方法让我们的自动化锦上添花
我们给大家介绍的是 JUnit 5 , 需要我们至少是 JDK 1.8 版本才可以使用
先把 JUnit 的依赖贴在这里

<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter</artifactId>
  <version>5.8.2</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.junit.platform</groupId>
  <artifactId>junit-platform-suite</artifactId>
  <version>1.8.2</version>
  <scope>test</scope>
</dependency>

image.png
如果之前使用过 JUnit4 的话 , 那么这次下载 Junit5 可能就会失败
解决方法是找到之前下载好的 JUnit4 依赖 , 删掉之后再重新下载 JUnit5
那引入了 JUnit 之后 , 我们就不需要再创建 main 去调用各个方法了

一 . 相关注解

JUnit 中提供了非常强大的注解功能
我们常用的注解都有 : @Test、@BeforeEach、@BeforeAll、@AfterEach、@AfterAll

1.1 @Test

在方法上面加上 @Test 就代表该方法是测试方法
我们看看加上这个注解有什么用处 ?
image.png
image.png
@Test表示该方法是测试方法 , 执行当前这个类的时候 , 会自动执行该类下所有带 @Test注解的用例

在写自动化的时候 , 我们通常把每个方法都叫做每个自动化的测试用例

image.png

package com.ethan3;

import org.junit.jupiter.api.Test;

public class junitTest {

    @Test
    public void testAnnotation() {
        System.out.println("测试 @Test 注解");
    }
}

我们通过控制台也能发现好多信息
image.png

1.2 @BeforeEach

@BeforeEach 指的是当我们的方法被 @BeforeEach 修饰的时候 , 就意味着当前的方法需要在每个用例执行之前都执行一次
image.png

package com.ethan3;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class junitTest {
    
    @BeforeEach
    public void testAnnotation() {
        System.out.println("测试 @Test 注解");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }
}

1.3 @BeforeAll

@BeforeAll 的作用是当前的方法需要在当前类下所有用例之前执行一次
但是加到方法上面 , 运行还报错了
image.png
它提示我们要想使用 @BeforeAll 的话 , 这个方法需要是静态的

package com.ethan3;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class junitTest {

    @BeforeAll
    public static void testAnnotation() {
        System.out.println("测试 @Test 注解");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }
}

image.png
我们也可以参考 类变量 , 整个类只有一个 , 所以只会打印一次

1.4 @AfterEach

@AfterEach 指的是 当前的方法需要在每个用例执行之后都执行一次
image.png

package com.ethan3;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class junitTest {

    @AfterEach
    public void testAnnotation() {
        System.out.println("测试 @Test 注解");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }
}

1.5 @AfterAll

@AfterAll 指的是 当前的方法在当前类下所有的用例执行之后执行一次
注意 : 被该注解修饰的方法必须是静态的
image.png

二 . 断言

2.1 assertEquals

当我们获取到文本的时候 , 我们可以判断该文本对不对
比如这个案例 :
image.png
那我们就可以通过断言来站在机器的角度上看一下到底是否正确

package com.ethan3;

import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class junitTest {
    @Test
    public void review() {
        ChromeDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
        String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");// 得到"百度一下"

        // 假如我们获取到的不是百度一下,而是百度两下
        // 对于测试人员来说,就是 Bug
        // 但是对于程序来说,是正确的,因为他并未报错
        System.out.println(text);

        // 使用 Assertions.assertEquals 进行断言
        Assertions.assertEquals("期盼值", text);

        driver.quit();
    }
}

如果跟我们设定的预期值不符 , 就会报错 , 测试人员就会立马排查问题

2.2 assertNotEquals

assertNotEquals 的作用就是当实际值和预期值不符的时候 , 程序才不报错 , 运行成功

package com.ethan3;

import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class junitTest {

    @Test
    public void review() {
        ChromeDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
        String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");// 得到"百度一下"
    
        // 假如我们获取到的不是百度一下,而是百度两下
        // 对于测试人员来说,就是 Bug
        // 但是对于程序来说,是正确的,因为他并未报错
        System.out.println(text);
    
        // 使用 Assertions.assertEquals 进行断言
        Assertions.assertNotEquals("期盼值", text);
    
        driver.quit();
    }

}

2.3 assertTrue / assertFalse : 断言结果为真/假

package com.ethan3;

import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class junitTest {
    @Test
    public void assertDemo() {
        Assertions.assertTrue(1 == 1);
    }
}

2.4 assertNull / assertNotNull : 断言结果为空 / 不为空

package com.ethan3;

import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class junitTest {

    @Test
    public void assertDemo2() {
        Assertions.assertNull("","你好");// 断言失败
    }

    @Test
    public void assertDemo3() {
        Assertions.assertNotNull("","你好");// 断言成功
    }
}

image.png

三 . 用例的执行顺序

官方网站没有明确说明默认的执行顺序的规则 , 测试用例的执行并不会按照我们编写用例的顺序来执行
image.png
那就会存在一定问题 :
比如我们的博客系统 , 我们想要对登录功能进行测试 , 需要编写测试用例

  1. 检查登录页面展现是否正确
  2. 检查正常登录
  3. 检查异常登陆

如果先执行了第二个测试用例 , 页面就跳转到了博客列表页 . 那接下来再去执行第一条测试用例 , 就肯定会报错
我们只有先检查登录页面展现是否正确之后 , 再去检查第三条

3.1 通过 Order 注解来排序

我们的当前类中 , 有非常多的用例 , 那么在这个类中 , 按照什么顺序来执行呢 ?
我们首先需要在类上加上一个注解 : @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
这个注解的作用是强调(声明)用 order 来进行排序
接下来在每个用例上面加上 @Order(顺序) 来决定每个用例的执行顺序

package com.ethan4;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class junitTest {
    @Test
    @Order(1)
    public void loginTest() {
        System.out.println("1::loginTest");
    }
    @Test
    @Order(2)
    public void editTest() {
        System.out.println("2::editTest");
    }
    @Test
    @Order(3)
    public void indexTest() {
        System.out.println("3::indexTest");
    }

}

image.png
注意 : 用例上面的 @Test 注解是不能删掉的

四 . 参数化

针对于博客系统的登录功能 , 每个用户的用户名和密码是各不相同的 . 这样的话就会导致参数各不相同
这样的话我们就需要写出无穷无尽的方法去解决他
image.png
我们就可以使用参数化的方式来处理各式各样的参数问题 , 尽可能通过一个用例 , 多组参数来模拟用户的行为

4.1 单参数注解手动编写数据源

在使用参数化注解之前 , 需要先声明该方法为参数化方法 , 使用注解 : @ParameterizedTest
那这个参数从哪里来 , 我们还需要声明一个注解 : @ValueSource(strings = {“甄嬛”,“沈眉庄”,“安陵容”})
image.png
这就是我们的参数化 , 通过参数化注解 , 我们就把参数传递给测试用例中 , 供测试用例使用

package com.ethan4;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class junitTest {

    @ParameterizedTest
    @ValueSource(strings = {"甄嬛","沈眉庄","安陵容"})
    public void sparamTest(String name) {
        System.out.println("name:" + name);
    }
}

那这个 @ValueSource() 到底是怎么回事 ?
@ValueSource(数据类型方法 = {“参数1”,“参数2”,“参数3”…})
其中 , 数据类型支持 : short、byte、int、long、double、char…
image.png
这几个数据类型在 JUnit 中不单单是简单的数据类型 , JUnit 将这些数据类型封装成了一个方法
我们回到 IDEA 也可以看一下
image.png
但是 @ValueSource() 只支持单参数

4.2 多参数从 csv 文件获取数据来源

package com.ethan4;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class junitTest {

    @ParameterizedTest
    @CsvSource({"甄嬛,20", "沈眉庄,25", "安陵容,26"})
    public void moreParamsTest(String name,int age) {
        System.out.println("name:" + name + " age:" + age);
    }

}

image.png


那要是我们有非常多的数据 , 我们难不成要写非常多的 “” , 这肯定不行
我们就可以在其他文件写好 , 让我们的注解直接调用到这个文件 , 执行里面的数据
我们创建一个 csv 文件 , 在里面写好数据
image.png
然后使用 @CsvFileSource(files = “路径名”) 导入文件

package com.ethan4;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class junitTest {

    @ParameterizedTest // 表示该方法是参数化方法
    @CsvFileSource(files = "D:\\study\\JavaCode\\selenium_demo\\test.csv") // 导入第三方文件
    public void csvFileParamsTest(String name,int age) {
        System.out.println("name:" + name + " age:" + age);
    }


}

image.png
如果发生乱码导致报错的话 , 手动创建一个 txt 文件 , 按照这种格式来编辑数据 , 然后再修改后缀名为 csv

zhangsan,18
lisi,20
wangwu,26

4.3 动态参数方法

通过动态方法提供数据源 , 构造出动态的数据

package com.ethan4;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.stream.Stream;

public class junitTest {

    @ParameterizedTest // 先声明该方法是参数化方法
    @MethodSource("methodParams") // 指定动态数据来源
    public void dynamicParamsTest(String name,int age) {
        System.out.println("name:" + name + " age:" + age);

    }

    /**
     * 1. 方法必须是静态的
     * 2. 返回值是 Stream<Arguments>
     * 3. 返回 Stream.of 对象
     * @return
     * @throws InterruptedException
     */
    static Stream<Arguments> methodParams() throws InterruptedException {
        // 构造动态参数
        String[] arr = new String[5];
        for (int i = 0; i < arr.length; i++) {
            Thread.sleep(500);
            arr[i] = System.currentTimeMillis() + "";
        }
        return Stream.of(
                Arguments.arguments(arr[0],20),
                Arguments.arguments(arr[1],20),
                Arguments.arguments(arr[2],20),
                Arguments.arguments(arr[3],20),
                Arguments.arguments(arr[4],20)
        );
    }

}

image.png
我们运行一下
image.png


那我们把刚才写好的数据来源注释掉 , 然后编写一个新的数据来源 , 与我们打印的用例同名 , 但是上面的 @MethodSource() 注解 , 我们就不写括号里面的数据来源了 , 这样也是可以的
image.png

package com.ethan4;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.stream.Stream;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class junitTest {

    @ParameterizedTest // 先声明该方法是参数化方法
    @MethodSource // 指定动态数据来源
    public void dynamicParamsTest(String name,int age) {
        System.out.println("name:" + name + " age:" + age);

    }

    static Stream<Arguments> dynamicParamsTest() throws InterruptedException {
        // 构造动态参数
        String[] arr = new String[5];
        for (int i = 0; i < arr.length; i++) {
            Thread.sleep(500);
            arr[i] = System.currentTimeMillis() + "";
        }
        return Stream.of(
                Arguments.arguments(arr[0],20),
                Arguments.arguments(arr[1],20),
                Arguments.arguments(arr[2],20),
                Arguments.arguments(arr[3],20),
                Arguments.arguments(arr[4],20)
        );
    }
}

也是可以运行的
image.png


最后注意一点 , 使用了参数化注解的方法不能再用 @Test 注解了 , 也就意味着 @Test 只能作用在非参数化的用例上
image.png

五 . 测试套件

为了模拟测试套件 , 我们新创建三个类 , 每个类中都写上一些最基础的测试方法
image.png
我们之前都是运行一个类中的所有方法 , 那我们要是想运行多个类中的多个方法 , 意思就是我们怎么一起运行 test1 test2 test3 呢 ?
我们就可以使用测试套件

5.1 指定类来运行包下所有用例

我们首先需要创建一个测试套件 , 实际上就是创建一个新的类 , 加上注解 : @Suite , 标识这是一个测试套件类而不是测试类
image.png
接下来 , 我们需要指定我们需要跑哪些类 , 使用注解 : @SelectClasses() , 里面使用 {} 把我们需要测试的类加进去
image.png
运行一下
image.png
那如果我们 @SelectClasses() 里面的某一个类里面的某个用例没加 @Test , 那么就不会执行这个方法
image.png
我们刚刚还介绍了参数化的用例 , 他并没有用 @Test 注解啊 ?
其实参数化用例 , 测试套件也是能扫描到的
image.png

5.2 指定包来运行包下所有用例

使用 : @SelectPackages("包的路径) 来指定要执行的方法集合
image.png
运行一下
image.png
他为什么只跑了 junitTest 了呢 ?
这是因为我们指定包来运行范围的话 , 文件名命名规则需要以 Test/Tests 结尾 (T 还得必须大写)
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1211966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构—内部排序(下)

文章目录 8.内部排序(下)(6).归并排序#1.先做合并#2.再来排序#3.代码实现#4.稳定性与时间复杂度分析 (7).快速排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (8).基数排序#1.算法思想#2.稳定性和时间复杂度分析 小结 8.内部排序(下) (6).归并排序 那我们的时间复杂度还…

【评论送书】十本架构师成长和软件架构技术相关的好书(可以任选)

正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 参与规则 本次送书1~5本参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff08;从评论区…

Maven:通过相对路径向jar中添加依赖项

问&#xff1a;我有一个专有的jar&#xff0c;我想把它作为一个依赖项添加到我的pom中。 但我不想把它添加到存储库中。原因是我希望常用的maven命令(如mvn compile等)能够开箱即用。(无需要求开发人员自己将其添加到某个存储库中)。 我希望jar在源代码控制中的第三方库中&…

idea菜单栏任务栏放缩比例修改

在编辑自定义VM选项中增加 -Dide.ui.scale0.8 参数 Help -> Edit Custom VM Options

Visual Studio Code配置c/c++环境

Visual Studio Code配置c/c环境 1.创建项目目录2.vscode打开项目目录3.项目中添加文件4.文件内容5.配置编译器6.配置构建任务7.配置调试设置 1.创建项目目录 d:\>mkdir d:\c语言项目\test012.vscode打开项目目录 3.项目中添加文件 4.文件内容 #include <iostream> u…

Linux C 编程入门 (GCC 和 Makefile的使用和编写)

Linux C 编程入门 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。Ubuntu 下也有一些可以进行编程的工具&#xff0c;但是大多都只是编辑器&#xff0c;也就是只能进行代码编辑&#xff0c;如果要编译的话就需要用到 GCC 编译器&…

基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 训练集图片处理1&#xff09;数据加载2&#xff09;图像处理 2. 测试图片处理1&#xff09;图像读取2&#xff09;图像处理 相关其它博客工程源代码下载其它资料下载 前言 本项目基于从网络获取的多种银行卡数据…

AR贴纸特效SDK,无缝贴合的虚拟体验

增强现实&#xff08;AR&#xff09;技术已经成为了企业和个人开发者的新宠。它通过将虚拟元素与现实世界相结合&#xff0c;为用户提供了一种全新的交互体验。然而&#xff0c;如何将AR贴纸完美贴合在人脸的面部&#xff0c;同时支持多张人脸的检测和标点及特效添加&#xff0…

【Android 】android13 新权限获取 读写文件权限

android13 新权限获取 参考&#xff1a;Android 13(API 33)读写SD卡权限的调整适配 - Mr,Han - 博客园 android在 获取文件读写权限&#xff08;尤其是音视频、图片等等资源&#xff09;的权限获取逻辑更换了。 必须申请如下权限&#xff1a; public static final String READ…

RedisTemplate乱码问题

其实这是在解决一个项目问题是发现的&#xff0c;因为原开发者的大意&#xff0c;造成了系统出现严重的逻辑问题。 因为系统系统采用分模块开发&#xff0c;某模块使用Spring提供的RedisTemplate进行值的读写&#xff0c;另一位使用了框架基于Jedis的一套公用方法进行值的读写…

java springboot application中设置正确的数字密码连不上数据库问题解决

说一个真实存在的问题 就是 有时候 我们在配置文件中设置了正确的数据库密码 但是 就是连不上 比如 我在application.yml配置文件中配置了一个数据库密码 这里 我们写的是 0127 然后 我们在程序中 读取并打印出来 看看系统拿到的到底是个什么&#xff1f; 但怪了 系统给我们…

选择墨西哥专线双清包税前需要了解什么?

选择墨西哥专线双清包税前&#xff0c;需要了解以下几个方面的情况&#xff1a; 1. 墨西哥市场的需求和特点&#xff1a;首先需要了解墨西哥的市场需求和特点&#xff0c;包括消费者对于产品的偏好、消费习惯、购买力等。对于汽配零件行业来说&#xff0c;需要了解墨西哥汽车市…

【考研数据结构代码题6】构建二叉树及四大遍历(先中后层)

题目&#xff1a;请你编写完整的程序构建一棵二叉树并对其进行先序遍历、中序遍历、后序遍历与层次遍历&#xff0c;分别打印并输出遍历结果 难度&#xff1a;★★★ 二叉树的存储结构 typedef struct Node{char data;//数据域struct Node* left;//左子树struct Node* right;//…

Masked Relation Learning for DeepFake Detection

一、研究背景 1.现有deepfake检测方法大多关注于局部伪影或面部不协调&#xff0c;较少挖掘局部区域间的关系。 2.现有关系挖掘类的工作往往忽略了关系信息的传播。 3.遮挡建模在减轻信息冗余的同时促进高级语义信息&#xff08;诱导性偏差较小&#xff09;的挖掘&#xff0c;有…

java常用的几个图片处理工具对Tiff文件的支持

ImageMagick 官网 https://imagemagick.org/&#xff0c; 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ &#xff0c; github地址https://github.com/opencv/opencv&…

ruoyi若依前端请求接口超时,增加响应时长

问题&#xff1a; 前端查询请求超时 解决&#xff1a; 找到request.js的timeout属性由10秒改成了20秒&#xff0c;因为默认是10秒&#xff0c;请求肯定是超出了10秒 祝您万事顺心&#xff0c;没事点个赞呗&#xff0c;关注一下也行啊&#xff0c;有啥要求您评论哈

父组件用ref获取子组件数据

子组件 Son/index.vue 子组件的数据和方法一定要记得用defineExpose暴露&#xff0c;不然父组件用ref是获取不到的&#xff01;&#xff01;&#xff01; <script setup> import { ref } from "vue"; const sonNum ref(1); const changeSon () > {sonNum.…

FSOD论文阅读 - 基于卷积和注意力机制的小样本目标检测

来源:知网 标题:基于卷积和注意力机制的小样本目标检测 作者:郭永红&#xff0c;牛海涛&#xff0c;史超&#xff0c;郭铖 郭永红&#xff0c;牛海涛&#xff0c;史超&#xff0c;郭铖&#xff0e;基于卷积和注意力机制的小样本目标检测 [J/OL]&#xff0e;兵工学报. https://…

行情分析——加密货币市场大盘走势(11.15)

大饼按照预期等待下跌即可&#xff0c;现在已经下跌到35500&#xff0c;昨日晚上跌破了35000&#xff0c;现在放心大胆空。笔者现在都是空单在手。 空单策略&#xff1a;入场36000附近 止盈34000-32000 止损39000 以太昨日策略进场&#xff0c;已经止盈了&#xff0c;最低跌到…