Java笔试面试题AI答之单元测试JUnit(3)

news2024/11/26 11:54:45

文章目录

  • 13. 什么是注释以及它们如何在JUnit中有用?
      • 什么是注释(Annotation)?
      • 注释在JUnit中的用途
  • 14. 解释如何测试”受保护”方法?
      • 1. 使用子类
      • 2. 同一包内直接测试
      • 3. 反射(在支持的语言中)
      • 4. 注意事项
  • 15. 解释什么是单元测试用例?
      • 单元测试用例的定义与特点
      • 单元测试用例的编写目的
      • 单元测试用例的编写原则
      • 单元测试用例的编写步骤
      • 单元测试用例的重要性
  • 16. 请阐述单元测试用例常见的清单 ?
      • 1. 输入数据验证
      • 2. 边界条件测试
      • 3. 特殊和异常情况测试
      • 4. 日期和时间验证
      • 5. 系统接口测试
      • 6. 正向和反向测试用例
      • 7. 代码覆盖测试用例
      • 8. 其他常见测试
      • 9. 辅助测试
      • 10. 测试计划和报告
  • 17. 简述JUnit org.junit.Assert类的作用 ?
  • 18. 简述JUnit org.junit.TestResult类的作用 ?
      • 主要作用
      • 示例用法

13. 什么是注释以及它们如何在JUnit中有用?

什么是注释(Annotation)?

注释(在Java中称为注解,Annotation)是Java提供的一种对代码进行标记的元数据形式。它们不会直接影响程序的执行,但可以被编译器或运行时环境读取,并根据这些注释执行特定的任务。注释可以应用于类、方法、参数、变量等。它们以@符号开头,后跟注释名和可选的元素(如果注释定义了元素)。

注释在JUnit中的用途

JUnit是一个广泛使用的Java测试框架,它允许开发人员编写可重复的测试来验证代码的正确性。在JUnit中,注释扮演着至关重要的角色,因为它们为测试代码提供了丰富的元数据和配置选项,从而增强了测试的可读性、可维护性和灵活性。以下是一些JUnit中常用的注释及其用途:

  1. @Test

    • 这是JUnit中最基本的注释之一,用于标记一个方法为测试方法。当JUnit运行时,它会查找所有用@Test注释的方法,并自动执行它们。
    • 可以与期望(expected)属性一起使用,来指定测试失败时应该抛出的异常类型。
  2. @Before@After

    • @Before注释的方法将在每个测试方法执行之前运行。这通常用于设置测试所需的任何前提条件或初始化代码。
    • @After注释的方法将在每个测试方法执行之后运行。这通常用于清理资源或重置状态,以确保测试的独立性。
  3. @BeforeClass@AfterClass

    • @BeforeClass注释的方法将在当前测试类中的所有测试方法执行之前运行一次。它通常用于执行昂贵的初始化操作,这些操作只需在每个测试类开始时执行一次。
    • @AfterClass注释的方法将在当前测试类中的所有测试方法执行之后运行一次。它通常用于执行清理操作,这些操作也只需在每个测试类结束时执行一次。
  4. @Ignore@Disabled(取决于JUnit版本):

    • 此注释用于暂时禁用某个测试方法或测试类。这很有用,当某个测试暂时失败,但你不希望它影响其他测试的执行时。
  5. @Parameters(JUnit 4的参数化测试)和 @ParameterizedTest(JUnit 5):

    • 这些注释用于参数化测试,允许你以不同的参数多次运行相同的测试方法。这对于测试具有多个可能输入值的代码非常有用。
  6. @RunWith(JUnit 4)和 @ExtendWith(JUnit 5):

    • 这些注释用于指定运行器(Runner)或扩展(Extension),它们可以改变测试的运行方式。例如,JUnit 4的@RunWith(Parameterized.class)用于参数化测试,而JUnit 5的@ExtendWith(SpringExtension.class)可以与Spring框架集成。

通过使用这些注释,JUnit为Java开发人员提供了一种强大而灵活的方式来编写、组织和执行测试。

14. 解释如何测试”受保护”方法?

测试“受保护”方法(Protected Methods)通常涉及在保持封装性和访问控制的同时,验证这些方法的正确性和行为。由于受保护方法只能在同一包内或子类中被访问,测试它们需要一些特定的策略。以下是一些常用的方法来测试受保护方法:

1. 使用子类

方法描述

  • 创建一个子类,从包含受保护方法的类继承。
  • 在子类中,创建一个公共方法来调用和测试基类的受保护方法。

示例(以Python为例):

# 假设我们有一个基类,包含一个受保护的方法
class BaseClass:
    def _protected_method(self, input):
        # 受保护方法的实现
        return input * 2

# 创建一个子类来测试受保护方法
class TestClass(BaseClass):
    def test_protected_method(self):
        # 调用基类的受保护方法
        result = self._protected_method(5)
        # 验证结果
        assert result == 10

# 在单元测试中实例化子类并调用测试方法
# 这里省略了单元测试框架的代码,如使用unittest等

2. 同一包内直接测试

方法描述

  • 如果测试类和被测试类位于同一个包中,测试类可以直接访问受保护方法。
  • 在测试类中编写测试方法来调用并验证受保护方法的行为。

注意事项

  • 这种方法破坏了封装性,因为它要求测试类与被测试类在同一包中。
  • 在实际应用中,为了保持代码的清晰和可维护性,建议尽量使用第一种方法。

3. 反射(在支持的语言中)

方法描述

  • 在某些语言中(如Java、C#),可以使用反射机制来访问和测试受保护方法。
  • 反射允许程序在运行时检查或修改其行为,包括访问私有和受保护的方法和属性。

示例(以Java为例,但请注意实际使用中应谨慎使用反射进行测试):

// 假设我们有一个类,包含一个受保护的方法
class MyClass {
    protected String protectedMethod(String input) {
        return "Processed: " + input;
    }
}

// 使用反射测试受保护方法
public class ReflectionTest {
    public static void main(String[] args) throws Exception {
        MyClass obj = new MyClass();
        Method method = MyClass.class.getDeclaredMethod("protectedMethod", String.class);
        method.setAccessible(true); // 允许访问受保护方法
        String result = (String) method.invoke(obj, "Hello");
        System.out.println(result); // 输出:Processed: Hello
    }
}

4. 注意事项

  • 封装性:在测试受保护方法时,应尽量避免破坏类的封装性。尽量通过子类或同包访问的方式来测试。
  • 可读性:测试代码应具有良好的可读性,以便其他开发人员能够理解测试的目的和逻辑。
  • 可维护性:测试代码应与被测试代码一起维护,以确保随着被测试代码的更改,测试代码也能保持有效。

通过以上方法,可以有效地测试受保护方法,确保它们的行为符合预期。

15. 解释什么是单元测试用例?

单元测试用例是软件开发过程中的一种重要测试方法,旨在对程序的最小可测试单元进行验证。这些最小单元可以是函数、方法、类或模块等。单元测试用例通过编写和执行一系列自动化的测试代码,来确保这些单元能够按照预期工作,并且及时发现和修复潜在的问题。

单元测试用例的定义与特点

  1. 定义

    • 单元测试用例是一段自动化的代码,这段代码调用被测试的单元(如函数、方法等),并对这个单元的单个最终结果进行检验。它主要关注于验证单个工作单元的行为是否符合预期。
  2. 特点

    • 自动化:单元测试用例是自动化的,可以快速地运行和重复执行,提高测试效率。
    • 可靠:单元测试本身应该是可靠的,即该失败的时候失败,该成功的时候成功,这样才能让开发人员信任测试结果。
    • 可读:单元测试用例应该易于理解,以便其他开发人员能够轻松地阅读和维护。
    • 可维护:随着代码的变更,单元测试用例也需要相应地更新和维护,以保持其有效性。

单元测试用例的编写目的

  1. 检查单元是否按设计工作:确保每个单元都能够按照预期的方式工作,实现其设计功能。
  2. 处理错误和异常:通过测试各种正向和反向的情况,验证单元是否能够合理地处理错误和异常情况。
  3. 提高代码质量:通过单元测试,可以及时发现和修复代码中的缺陷和逻辑错误,从而提高代码的整体质量。

单元测试用例的编写原则

  1. 覆盖率高:尽可能覆盖所有的代码路径和分支,确保测试的全面性。
  2. 独立性:每个单元测试用例应该独立运行,不依赖于其他测试用例的执行结果。
  3. 简单性:测试用例应该简单明了,避免复杂的逻辑和冗余的代码。
  4. 可重复性:测试用例应该是可重复的,能够在不同的环境和条件下产生一致的结果。

单元测试用例的编写步骤

  1. 确定测试目标:明确要测试的单元和预期的行为。
  2. 编写测试用例:根据测试目标编写相应的测试用例,包括输入数据、执行条件和预期结果。
  3. 执行测试用例:使用单元测试框架执行测试用例,并观察测试结果。
  4. 分析测试结果:根据测试结果分析测试是否成功,以及失败的原因。
  5. 修复问题:如果测试失败,根据失败的原因修复代码中的问题,并重新执行测试用例进行验证。

单元测试用例的重要性

单元测试用例在软件开发过程中扮演着重要的角色,它可以帮助开发人员及时发现和修复代码中的问题,提高代码的质量和可维护性。同时,单元测试用例还可以作为代码重构和优化的依据,确保在修改代码的同时不会引入新的问题。此外,单元测试用例还可以作为项目的文档之一,帮助其他开发人员理解代码的功能和用法。

16. 请阐述单元测试用例常见的清单 ?

单元测试用例的编写是确保软件单元(如函数、过程、类等)按预期工作的关键步骤。以下是单元测试用例常见的清单,这些清单可以帮助测试人员系统地设计和执行测试用例:

1. 输入数据验证

  • 必传项测试:确保所有必传参数都已提供。
  • 唯一字段值测试:检查字段值是否唯一。
  • 空值测试:验证字段是否能接受空值,以及空值时的行为。
  • 字段限制测试:包括字段长度限制、允许的字符集等。
  • 负值测试:如果适用,检查负值是否处理得当。
  • 不可能的值和垃圾值测试:测试输入非法或不合逻辑的值,验证系统能否正确处理或抛出错误。

2. 边界条件测试

  • 边界值测试:选择正好等于、刚刚大于、刚刚小于边界的值进行测试。
  • 等效类划分:将输入范围划分为几个等效类,从每个类中选取代表值进行测试。

3. 特殊和异常情况测试

  • 错误和异常处理测试:验证系统在出现错误或异常情况时的响应。
  • 特殊用例测试:包括那些可能影响系统安全、保密性的测试用例。

4. 日期和时间验证

  • 日期验证:检查日期字段是否符合预期格式和有效性。
  • 时间验证:检查时间字段是否符合预期格式(如12/24小时制、AM/PM等)。

5. 系统接口测试

  • 接口参数测试:检查在多个系统之间传输的字段是否准确、完整。
  • 数据一致性测试:验证通过接口传输的数据在不同系统间是否保持一致。

6. 正向和反向测试用例

  • 正向测试用例:验证系统是否实现了设计说明书中的功能指标和性能指标。
  • 反向测试用例:验证系统是否不会执行不应做的操作或产生意外的副作用。

7. 代码覆盖测试用例

  • 代码覆盖测试:设计测试用例以覆盖代码的不同部分,包括分支、循环等,以确保代码得到充分测试。

8. 其他常见测试

  • 性能测试:检查系统在特定负载下的表现。
  • 安全测试:验证系统对安全漏洞的抵抗能力。
  • 回归测试:在代码更改后重新运行以前的测试用例,确保没有引入新的问题。

9. 辅助测试

  • 驱动模块和桩模块:为被测试单元提供必要的上下文和数据,模拟其他依赖组件的行为。

10. 测试计划和报告

  • 测试计划:详细记录测试的范围、目标、方法和时间表。
  • 测试报告:记录测试结果、发现的问题和修复情况,供开发人员和项目经理参考。

综上所述,单元测试用例的清单是一个全面而详细的框架,旨在确保软件单元在各种可能的情况下都能正常工作。在实际应用中,测试人员应根据项目的具体需求和软件特性,灵活选择和调整测试用例的清单。

17. 简述JUnit org.junit.Assert类的作用 ?

JUnit 的 org.junit.Assert 类是 JUnit 测试框架中非常核心的一部分,它提供了一系列的静态方法来帮助开发者在测试中验证代码的行为是否符合预期。这些断言(Assertions)方法用于检查测试结果是否满足特定的条件,如果不满足,则测试失败并抛出一个异常。使用这些断言方法可以使得测试代码更加简洁明了,易于阅读和维护。

Assert 类的主要作用包括:

  1. 验证相等性:通过 assertEquals 方法(及其变体,如 assertEquals(Object expected, Object actual, String message))来验证两个值是否相等。如果不相等,则测试失败。此外,还有 assertSame 用于验证两个对象引用是否指向同一个对象,以及 assertNotSame 用于验证两个对象引用是否不指向同一个对象。

  2. 验证真值assertTrue 方法用于验证给定的布尔表达式是否为真。如果为假,则测试失败。相应地,assertFalse 方法用于验证给定的布尔表达式是否为假。

  3. 验证空值assertNull 方法用于验证某个对象是否为 null,而 assertNotNull 方法则用于验证某个对象是否不为 null

  4. 验证数组内容:JUnit 提供了一系列断言方法来验证数组或集合的内容,如 assertArrayEquals 用于验证两个数组是否相等(即包含相同的元素),assertIterableEquals 用于验证两个集合是否包含相同的元素。

  5. 失败断言fail 方法允许开发者在测试中的任意点显式地标记测试为失败。这可以用于测试那些预期会抛出异常,但实际上没有抛出异常的代码路径。

  6. 异常验证:JUnit 4 引入了 @Test(expected = Exception.class) 注解来验证测试方法是否抛出了预期的异常。而在 JUnit 5 中,虽然不再推荐使用这种注解方式,但可以通过 assertThrows 方法来更灵活地验证异常。尽管 assertThrows 不是 Assert 类的一部分,但它也是 JUnit 验证代码行为的重要工具。

  7. 字符串验证:JUnit 提供了 assertThat 方法(注意:在 JUnit 4 中,assertThat 是 Hamcrest 库的一部分,但在 JUnit 5 中被整合进了 JUnit 本身的 API),它允许开发者使用更丰富的匹配器(Matchers)来验证字符串的内容。

通过使用 Assert 类中的这些断言方法,开发者可以编写出更加健壮和可靠的测试,从而确保他们的代码按预期工作。

18. 简述JUnit org.junit.TestResult类的作用 ?

org.junit.TestResult 类在 JUnit 框架中扮演着非常重要的角色,尤其是在 JUnit 3 及其早期版本中。它主要用于收集并管理测试运行的结果。虽然随着 JUnit 4 和更高版本的推出,JUnit 提供了更多的注解和自动化支持,使得 TestResult 类的直接使用频率有所降低,但在理解 JUnit 框架的历史和某些特定场景下,了解 TestResult 类仍然是有益的。

主要作用

  1. 收集测试结果TestResult 实例负责跟踪测试运行期间发生的所有事件,包括测试方法的执行、成功、失败、忽略等。

  2. 统计测试结果:它提供了方法来统计测试的总数、成功数、失败数和忽略数,这对于生成测试报告非常有用。

  3. 处理异常:当测试方法抛出异常时,TestResult 能够捕获这些异常,并将它们记录为失败的测试。它还可以处理特定的异常类型,如 AssertionFailedError,这是 JUnit 中用于表示断言失败的异常。

  4. 测试监听:虽然 TestResult 本身不直接实现监听器模式,但它可以与监听器(如 TestListener)结合使用,以便在测试执行的不同阶段执行自定义操作。这允许开发者在测试运行时插入自定义逻辑,如记录日志、发送通知等。

  5. 集成与扩展TestResult 的设计使其易于扩展,以支持不同的测试运行策略。虽然在 JUnit 4 和更高版本中,这种需求更多地通过自定义运行器(Runner)和规则(Rule)来满足,但在需要直接控制测试执行流程的场景中,TestResult 或其类似的概念仍然是有用的。

示例用法

在 JUnit 3 及其早期版本中,你可能会看到像这样的代码,用于手动运行测试并收集结果:

TestResult result = new TestResult();
MyTest test = new MyTest();
test.run(result);

System.out.println("测试成功数: " + result.runCount());
System.out.println("测试失败数: " + result.failureCount());

然而,在 JUnit 4 和更高版本中,由于引入了注解和更丰富的测试运行器支持,上述手动运行测试并收集结果的方式变得不那么常见。相反,JUnit 提供了更高级的抽象,如 @Test 注解、@RunWith@Rule,以及 IDE 和构建工具的集成,以自动化测试运行和结果收集。

总的来说,org.junit.TestResult 类在 JUnit 框架中扮演了收集和管理测试运行结果的关键角色,尽管在较新版本的 JUnit 中,它的直接作用可能已经被其他更高级的特性和抽象所取代。

答案来自文心一言,仅供参考
在这里插入图片描述

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

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

相关文章

解决移动端1px 边框优化的8个方法

前言 您是否注意到 1px 边框在移动设备上有时会显得比预期的要粗?这种不一致源于移动屏幕的像素密度不同。 在 Web 开发中,我们使用 CSS 来设置页面样式。但是,CSS 中的 1px 并不总是转换为设备上的物理 1px。这种差异就是我们的“1px 边框…

uniapp对tabbar封装,简单好用

第一种&#xff0c;效果展示 上代码&#xff0c;新建一个公用组件&#xff0c;tabbar.vue <template><view class"tabbar"><view class"tabbar-item" click"tabbarbtn(0)"><image class"item-image" v-if"…

什么是机器学习中的 Bagging?带有示例的指南

文章目录 一、说明二、理解集成学习2.1 什么是 Bagging&#xff1f;2.2 Bagging 与 Boosting2.3 套袋的优点 三、Python 中的 Bagging&#xff1a;简短教程3.1 数据集3.2 训练机器学习模型3.3 模型评估 四、装袋分类器4.1 评估集成模型4.2 最佳实践和技巧 五、结论 ​ 一、说明…

systrace/perfetto第三方app的Trace.beginSection方法无效问题和TAG开放剖析

背景 针对程序如何在自己的代码中加入相关的trace方法和TAG来方便在systrace/perfetto中进行查看&#xff0c;下面这篇文章已经进行了详细的讲解&#xff1a; systrace/perfetto中需要actrace打tag相关方法-车载车机framework系统开发实战 有针对native的c代码&#xff0c;也…

Java面试题总结-基础和框架-面试题一

1、TCP和UDP tcp 和 udp 是 OSI 模型中的运输层中的协议。tcp 提供可靠的通信传输&#xff0c;而 udp 则常被用于让广播和细节控制交给应用的通信传输。 两者的区别大致如下&#xff1a; tcp 面向连接&#xff0c;udp 面向非连接即发送数据前不需要建立链接&#xff1b;tcp …

MQ-135空气质量传感器(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq135.h文件 mq135.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-135空气质量传感器属于MQ系列气体传感器&#xff0c;广泛用于检测有害气体、新鲜空气中的烟…

Vmware 傻瓜式安装( Linux 网络操作系统 01)

一、下载VMware虚拟机安装包 虚拟机下载链接&#xff1a;https://share.weiyun.com/4haPul0y ​ 二、安装 点击安装文件 ​ 点击下一步&#xff0c;勾选“我接受...条款"&#xff0c;继续点击下一步 修改更改安装位置&#xff0c;尽量不要安装到系统C盘&#xff1a; …

爆刷!LLM入门必备吴恩达新书-《面向开发者的LLM入门课程》

吴恩达联合OpenAI推出LLM现象级课程&#xff01;|||绝了||重磅首发&#x1f525; 1、LLM入门必看课程-吴恩达373 PDF||!适用于所有具备基础 Python 能力&#xff0c;想要入门 LLM 的学习者 2、由吴恩达老师与 OpenAI 联合推出的官方教程&#xff0c;面向入门 LLM 的开发者&…

[Linux入门]---进程替换

文章目录 1.进程替换原理2.进程替换函数2.1execl函数2.2execlp函数2.3execv函数2.4execvp函数2.5execle函数2.6execve函数2.7跨语言调用程序 3.总结 1.进程替换原理 一个程序替换的函数&#xff1a; #include <unistd.h> int execl(const char *path, const char *arg,…

Linux下的系统接口(实时更新)

文件操作 open pathname:路径 flags&#xff1a;文件的打开方式 mode&#xff1a;文件的权限 返回值 打开成功返回值该文件的文件描述符&#xff0c;打开失败返回-1。 write fd : 文件描述符 buf : 指向用于存储写入数据的缓冲区的指针 count : 写入字节的最大个数 返回…

7系列FPGA HR/HP I/O区别

HR High Range I/O with support for I/O voltage from 1.2V to 3.3V. HP High Performance I/O with support for I/O voltage from 1.2V to 1.8V. UG865&#xff1a;Zynq-7000 All Programmable SoC Packaging and Pinout

Jmeter之beanshell使用

beanshell&#xff1a;和setup类似&#xff0c;登录前需要做的工作&#xff0c;是一种java源代码解释器&#xff0c;具有脚本语言的特性 使用beanshell可以使jmeter实现更多的业务需求 beanshell常用语法 vars.get() 从jmeter中获得变量 vars.put() 把数据保存为jmeter的变量…

Access用了20年杀死VF,等来的却是:国产新型软件反杀

现如今&#xff0c;使用Access数据库的人可能不多了。 Access数据库 在早些年的时候&#xff0c;微软旗下有两个广为人知的桌面数据库开发工具。 一款是自家研发的Microsoft ACCESS&#xff0c;它依托Windows操作系统&#xff0c;并内嵌于Microsoft Office之中&#xff0c;深受…

2024下《系统规划与管理师》50个高频考点汇总!背就有效

今年高项仅考上半年一次&#xff0c;下半年考的高级科目只有系规难度相对较低&#xff0c;系规需要学习的内容比高项少很多&#xff0c;高项第四版教程731页&#xff0c;系规只有328页&#xff0c;少了一半多。并且系规IT内容会更少&#xff0c;考试内容大多在书上&#xff0c;…

接口幂等的方案

一、什么是幂等 幂等指多次操作产生的影响只会跟一次执行的结果相同&#xff0c;通俗的说&#xff1a;某个行为重复的执行&#xff0c;最终获取的结果是相同的。 二、什么是接口幂等 同一个接口&#xff0c;对于同一个请求&#xff0c;不管调用多少次&#xff0c;产生的最终…

除了C盘其它盘都不见了?专业数据恢复策略解析

在数字时代&#xff0c;数据几乎成为了我们生活与工作的核心。然而&#xff0c;当电脑突然遭遇“除了C盘其它盘都不见了”的困境时&#xff0c;无疑是对我们数据安全的一次重大挑战。面对这样的紧急情况&#xff0c;如何迅速、有效地恢复丢失的数据&#xff0c;成为了许多用户迫…

苹果被删视频怎么恢复?分享4个靠谱的方法

平时过年过节的时候&#xff0c;亲戚家的小孩总会拿你的手机乱点一通&#xff0c;有时可能会不小心点进手机相册里面&#xff0c;误删了相册里的视频。如果苹果用户遇到这种情况&#xff0c;那该如何恢复苹果被删视频呢&#xff1f;不要慌张&#xff0c;既然你点开了这篇文章&a…

cv::convexityDefects()详解

参考链接:详解OpenCV的函数convexHull()和函数convexityDefects(),并利用它们)做凸包(凸壳)检测及凸包(凸壳)的缺陷检测-CSDN博客 void convexityDefects( InputArray contour, InputArray convexhull, OutputArray convexityDefects ); 三个参数说明如下&#xff1a; contou…

Java ArrayList扩容机制 (源码解读)

结论&#xff1a;初始长度为10&#xff0c;若所需长度小于1.5倍原长度&#xff0c;则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义 1&#xff1a;数组默认长度 2:这是一个共享的空数组实例&#xff0c;用于明确创建长度为0时的ArrayList &#xff…

钙粘蛋白CDH:肿瘤靶点研究新秀

前 言&#xff1a; 钙粘蛋白是钙依赖性细胞间粘附的重要介质&#xff0c;属于跨膜糖蛋白。钙粘蛋白在组织稳态中起重要作用&#xff0c;促进组织发育、突触粘附和上皮屏障功能。钙粘蛋白功能改变与癌症进展、血管疾病和其他病理学有关。目前多种钙粘蛋白有望成为治疗靶点&…