();
thrown.expect(IndexOutOfBoundsException.class);
thrown.expectMessage("Index: 0, Size: 0");
list.get(0);
}
}
七、Matchers and assertThat
JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。并且使用全新的断言语法assertThat,结合Hamcrest提供的匹配符,只用这一个方法,就可以实现所有的测试。assertThat语法: assertThat(T actual, Matcher matcher); assertThat(String reason, T actual, Matcher matcher); 其中reason为断言失败时的输出信息,actual为断言的值或对象,matcher为断言的匹配器,里面的逻辑决定了给定的actual对象满不满足断言。Matchers详见: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html
八、Ignoring tests 忽略测试
方法用 @Ignore 注解了将不会被执行
类用 @Ignore 注解后,其下所有测试方法将不会被执行
public class IgnoreTest {
@Ignore("Test is ignored as a demonstration")
@Test
public void testSame() {
assertThat(1, is(1));
}
}
九、Timeout for tests 超时测试
@Timeout 注解用来测试特定方法的执行时间。如果测试方法的执行时间大于指定的超时参数,测试方法将抛出异常,测试结果为失败。指定的超时参数单位为毫秒 。1、@Test注解上的timeout参数,作用域为方法,单位毫秒
@Test(timeout = 2000)
public void testSleepForTooLong() throws Exception {
log += "ran1";
TimeUnit.SECONDS.sleep(100); // sleep for 100 seconds
}
2、Timeout Rule,作用域为测试类
public class TimeoutTests {
public static String log;
private final CountDownLatch latch = new CountDownLatch(1);
@Rule
public Timeout globalTimeout = Timeout.seconds(3); // 3 seconds max per method tested
@Test
public void testSleepForTooLong() throws Exception {
log += "ran1";
TimeUnit.SECONDS.sleep(100); // sleep for 100 seconds
}
@Test
public void testBlockForever() throws Exception {
log += "ran2";
latch.await(); // will block
}
}
十、Parameterized tests 参数化测试
参数化测试允许开发人员使用不同的值反复运行同一个测试。创建参数化测试步骤:
用 @RunWith(Parameterized.class) 来注释 test 类。
创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
创建一个公共的构造函数,接受测试数据。
为每一列测试数据创建一个实例变量。
用实例变量作为测试数据的来源来创建测试用例。1、Constructor方式
@RunWith(Parameterized.class)
public class FibonacciTest {
@Parameters(name = "{index}: fib({0})={1}")
public static Collection data() {
return Arrays.asList(new Object[][] {
{ 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
});
}
private int fInput;
private int fExpected;
public FibonacciTest(int input, int expected) {
this.fInput = input;
this.fExpected = expected;
}
@Test
public void test() {
assertEquals(fExpected, Fibonacci.compute(fInput));
}
}
2、Field injection方式
@RunWith(Parameterized.class)
public class FibonacciTest {
@Parameters(name = "{index}: fib({0})={1}")
public static Collection data() {
return Arrays.asList(new Object[][] {
{ 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
});
}
@Parameter // first data value (0) is default
public /* NOT private */ int fInput;
@Parameter(1)
public /* NOT private */ int fExpected;
@Test
public void test() {
assertEquals(fExpected, Fibonacci.compute(fInput));
}
}
十一、Assumptions with assume 假定测试
使用Assumptions类中的假设方法时,当假设不成立时会报错,但是测试会显示被ignore忽略执行。也就是当一个类中有多个测试方法时,其中一个假设测试方法假设失败,其他的测试方法全部成功,那么该测试类也会显示测试成功。假设方法适用于:在不影响测试是否成功的结果的情况下根据不同情况执行相关代码。
public class AssumptionsTest {
@Test
public void testAssumTrue() {
System.out.println("test");
assumeTrue(3>5);
//该方法中下面所有的代码在上面假设的条件成立后执行
//如果上述假设不成立,则会忽略执行该行下面的代码,并报错
System.out.println("assume is true!");
}
@Test
public void testAssumFalse(){
assumeFalse(3>5);
System.out.println("assume is true!");
}
}
以下语法JUnit5支持:
@Test
public void testAssumTrueMessage() {
assumeTrue(3<5,
//第二个参数为当第一个参数不成立时,输出的自定义错误信息
() -> "Aborting test: not on developer workstation");
System.out.println("assume is true!");
}
@Test
public void testAssumeTrueLambda(){
//这个方法的第一个参数为函数式接口,无参数返回值为boolean
assumeTrue(()->{
System.out.println("in assumeTrue");
boolean flag = false;
return flag;
});
System.out.println("out assumeTrue");
}
@Test
public void testAssumThat() {
assumingThat(3>5,
() -> {
//与上述方法不同的是,仅当前面假设成立时,才会执行这里面的语句
//且只会影响到该lambda表达式中的代码
assertEquals(2, 2);
});
//此处的断言不受上述assumingThat限制,在所有情况下都会执行
System.out.println("no effect");
assertEquals("a string", "a string");
}
十二、Rules 规则
一个JUnit Rule就是一个实现了TestRule的类,用来在每个测试方法的执行前后执行一些代码。1、框架自带的Rule JUnit自带很多已经实现过好了的JUnit Rule,比如Timeout,ExpectedException等等。2、自定义Rule 自定义一个Rule就是implement一个TestRule interface,实现一个叫apply()的方法。例:在测试方法运行之前,记录测试方法所在的类名和方法名,然后在测试方法运行之后打印出来。
public class MethodNameExample implements TestRule {
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
//base.evaluate()之前为测试方法运行之前所做操作
String className = description.getClassName();
String methodName = description.getMethodName();
//运行测试方法
base.evaluate();
//base.evaluate()之后为测试方法运行之后所做操作
System.out.println("Class name: "+className +", method name: "+methodName);
}
};
}
}
public class RuleTest2 {
@Rule
public MethodNameExample methodNameExample = new MethodNameExample();
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
@Test
public void mulitiplication_isCorrect() throws Exception {
assertEquals(4, 2 * 2);
}
}
十三、Theories
在参数化测试中,我们需要给定所有具体的测试数据组。而在Theories测试中,用户只需给定了一些数据,JUnit自动利用这些数据组合出各种各种可能的组合来执行测试。
1、内置实现
(1)@DataPoints注解静态变量方式
@RunWith(Theories.class)
public class TheoryTest {
//允许的最大误差
private static final double DELTA = 0.01;
/*@DataPoints注解静态变量*/
@DataPoint
public static int ZERO = 0;
@DataPoint
public static int TWO = 2;
@DataPoint
public static int EIGHT = 8;
//标志这个测试为Theory测试
@Theory
public void testDivide(int dividend, int divisor) {
//跳过除数为0的case
assumeThat(divisor, not(0));
//Calculator.divide(dividend, divisor)方法返回他们相除的结果
assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);
System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);
}
}
(2)@DataPoints注解静态方法方式
@RunWith(Theories.class)
public class TheoryTest {
//允许的最大误差
private static final double DELTA = 0.01;
/*@DataPoints注解一个静态方法*/
@DataPoints
public static int[] getTestData() {
return new int[]{0, 2, 8};
}
//标志这个测试为Theory测试
@Theory
public void testDivide(int dividend, int divisor) {
//跳过除数为0的case
assumeThat(divisor, not(0));
//Calculator.divide(dividend, divisor)方法返回他们相除的结果
assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);
System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);
}
}
@DataPoint用于注解静态变量(或静态方法),表示这个变量是个数据点。当执行testDivide这个Theory测试时,JUnit会把所有的DataPoint数据两两组合,形成一组组的测试数据,并用这些数据分别执行测试。执行上面的测试会输出以下结果:
Passed with: dividend=0, divisor=2
Passed with: dividend=0, divisor=8
Passed with: dividend=2, divisor=2
Passed with: dividend=2, divisor=8
Passed with: dividend=8, divisor=2
Passed with: dividend=8, divisor=8
(3)如果需要限定某个参数,可以使用@TestOn注解
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.experimental.theories.suppliers.TestedOn;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
@RunWith(Theories.class)
public class TheoryTest {
//允许的最大误差
private static final double DELTA = 0.01;
//如果需要限定某个参数,可以使用@TestOn注解
@Theory
public void testDivide2(
@TestedOn(ints = {0, 2, 8}) int dividend,
@TestedOn(ints = {2, 8}) int divisor
) {
assertEquals(dividend / divisor, Calculator.divide(dividend, divisor), DELTA);
System.out.println("Passed with: dividend=" + dividend + ", divisor=" + divisor);
}
}
2、自定义实现
JUnit默认只提供了一个int型的简单 Parameter Supplier 实现,而Theory机制真正的价值在于,能参考@TestedOn的做法,相对简单的完全自定义出可重用 Parameter Supplier,适应于各种复杂要求的限定范围参数值测试场景,满足开发者所需的高度动态自定义范围取值自动化测试,同时保留与一般@Test相同的强大兼容性。 例:(1)定义annotation注解接口Between
@Retention(RetentionPolicy.RUNTIME)
// 声明注解接口所使用的委托处理类
@ParametersSuppliedBy(BetweenSupplier.class)
public @interface Between{
// 声明所有可用参数,效果为 @Between([first = int,] last = int)
int first() default 0; // 声明默认值
int last();
}
(2)定义委托处理类 BetweenSupplier
public class BetweenSupplier extends ParameterSupplier {
@Override
public List getValueSources(ParameterSignature sig) {
// 自定义实参值列表
List list = new ArrayList();
// 获取注解变量
Between between = sig.getAnnotation(Between.class);
// 获取通过注解@Between传入的first值
int first = between.first();
// 获取通过注解@Between传入的last值
int last = between.last();
for (int i = first; i <= last; i++) {
// PotentialAssignment.forValue(String name, Object value)
// name为value的描述标记,没实际作用
// value为实参可选值
list.add(PotentialAssignment.forValue("name", i));
}
return list;
}
}
(3)调用方式
@RunWith(Theories.class)
public class TheoryDefinedTest {
@Theory
public final void test(@Between(last = 0) int i, @Between(first = 3, last= 10) int j) {
// i 取值为 0(first默认=0,last=0),j 取值为 3-10
System.out.println("i="+i+" j="+j);
}
}
(4)运行结果
i=0 j=3
i=0 j=4
i=0 j=5
i=0 j=6
i=0 j=7
i=0 j=8
i=0 j=9
i=0 j=10
十四、Test fixtures
Test Fixture是指一个测试运行所需的固定环境,也是就是测试运行之前所需的稳定的、公共的可重复的运行环境,这个“环境”不仅可以是数据,也可以指对被测软件的准备,例如实例化被测方法所依赖的类、加载数据库等等。
@Before - 在每个@Test方法之前运行
@After - 在每个@Test方法之后运行
@BeforeClass - 在所有的@Test方法之前运行一次
@AfterClass - 在所有的@Test方之后运行一次注: 1、如果创建一个子类继承有fixture注解的父类,那么子类中的@Before方法会在测试方法之前、父类的@Before执行之后执行。 2、如果@Before方法里抛出了异常,@Test方法会跳过,但是@After还是会执行 3、每个测试方法都会在单独的测试类的实例里面运行,@BeforeClass在测试实例创建之前执行
public class FixtureTest {
private static int quantity = 0;
public FixtureTest() {
quantity++;
}
@BeforeClass
public static void breforeTestOnlyOnce() throws Exception {
System.out.println("Run before all test only once..."+ quantity);
}
@AfterClass
public static void afterTestOnlyOnce() throws Exception {
System.out.println("Run after all test only once..."+ quantity);
}
@Before
public void beforePerTest() {
System.out.println("Run before per test ..."+ quantity);
}
@After
public void afterPerTest() {
System.out.println("Run after per test ..."+ quantity);
}
//Test Method
@Test
public void testOne() {
System.out.println("testOne Start..."+ quantity);
}
@Test
public void testTwo() {
System.out.println("testTwo Start..."+ quantity);
}
}
运行结果:
Run before all test only once...0
Run before per test ...1
testOne Start...1
Run after per test ...1
Run before per test ...2
testTwo Start...2
Run after per test ...2
Run after all test only once...2
十五、Categories 用例分类
category 和 testSuite的比较: testSuite是类级分组(xx.class),category是用例级分组(@Test),category是testSuite的升级category使用步骤: 1、创建好测试类,及测试类中的测试用例 2、创建接口:按用例的分组来创建 3、@Category注解:将用例用@Category注解分组 4、创建类来执行这些分组的类
public interface FastTests { /* category marker */ }
public interface SlowTests { /* category marker */ }
public class A {
@Test
public void a() {
fail();
}
@Category(SlowTests.class)
@Test
public void b() {
}
}
@Category({SlowTests.class, FastTests.class})
public class B {
@Test
public void c() {
}
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public class SlowTestSuite {
// Will run A.b and B.c, but not A.a
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@ExcludeCategory(FastTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public class SlowTestSuite {
// Will run A.b, but not A.a or B.c
}
十六、总结
如果你觉得此文对你有帮助,如果你对此文有任何疑问,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣请拉到最上面关注笔者的名字! 一箭三雕:如果你觉得本文对你有帮助,请关注,赞同,分享三连!谢谢! 作者出处:逍遥子:JAVA自动化之Junit单元测试框架详解 转载声明:欢迎转载,但未经作者同意请保留此段声明,并在文章明显位置给出原文链接。
你可能感兴趣的:(junit,测试似有方法)
macbook上的vim怎么设置语法高亮和显示行号
阿锋966
python vim
在我写这篇文章之前我的vim就很普通,没有语法高亮、无法显示行号。但是我通过在网上不断查阅一些处理方法和经验之后,我终于能将我MacBook电脑上的vim配置出语法高亮和显示行号了!作为一名乐于分享、乐于助人的新手程序员,我决定把我的解决办法分享给更多跟我遇到相似问题的人,去帮助他们解决问题。首先我想说的是,vim中的各个设置都被储存在一个名叫“vimrc”的文件之中,并且这个文件的路径就是:/u
自动化爬取json_爬虫解决方案之爬取“搜狗引擎”
公子大白0m0
自动化爬取json
主题.jpg1.爬取的背景为甚我们会提到“搜狗引擎爬虫呢”,一切根源来自于最近需要爬取领英的会员资料,我们可以通过人名|领英的方式具体的搜索以查询结果,这只是爬取领英的其中一个方法,具体的方法我们之后会讲,大家可以期待一下哦!,好了,讲回正题,我们该如何爬取“搜狗引擎”呢,我们先去首页看看搜狗首页.png我们可以看到每个链接的右下角都会有对应的时间和快照,这个是什么意思呢,因为我们爬取领英时需要登
react 封装一个类函数使用方法
特严赤傲
前端 reactjs react.js 前端框架
1.编写ProductCount函数classProductCount{publicstaticgetProductCount(count:number):string{if(count{formattedCount}}
object-c 2.0入门笔记
SNOWPIAOP
c语言 笔记 ios
OBJECT-C入门笔记OBJECT-C2.0的语法特点文件扩展名字符串类方法OBJECT-C2.0的语法特点有点类似C和C++,属于C语言超集。提供类定义,方法和属性。面向对象的概念,如封装,继承以及多态,在Objective-C中都有所体现。Cocoa基础文件扩展名扩展名内容类型.h头文件。头文件包含类,类型,函数和常数的声明。.m源代码文件。这是典型的源代码文件扩展名,可以包含Objecti
华硕ROG电脑开机无法进入系统?这些方法或许能帮到你
nntxthml
电脑 windows
华硕ROG电脑开机无法进入系统?这些方法或许能帮到你在日常使用电脑的过程中,我们难免会遇到各种故障问题,尤其是当我们满怀期待地打开电脑,却发现它无法正常进入系统时,那种焦虑与无助感简直让人难以忍受。近期,不少华硕ROG用户就遭遇了这样的困境,电脑开机后卡在ROG界面,无论如何也无法进入系统。针对这一问题,本文将为大家分享几种有效的解决方法,希望能帮助到大家。一、初步排查与基础操作在深入探讨具体的解
Mac 中 VIM的使用方法
西红柿天尊
springboot2 java
终端通过cd命令切换到相应目录,输入vim文件名.扩展名,进入到vim环境。vim的3种模式:命令模式,插入模式,底线命令模式命令模式用户刚刚启动vim,便进入了命令模式i切换到插入模式,以输入字符x删除当前光标所在处的字符:切换到底线命令模式,以在最底一行输入命输入模式:在命令模式下按下i就进入了输入模式。在输入模式中,可以使用以下按键ENTER(回车键)换行BACKSPACE(退格键)删除光标
电脑开机黑屏无法进入桌面的常见解决方法
mmoo_python
电脑 windows
电脑开机黑屏无法进入桌面的常见解决方法电脑开机后遇到黑屏,不显示任何内容,是许多用户都曾遇到过的问题。这种黑屏情况不仅令人困惑,还可能影响工作和学习。本文将介绍一些常见的解决方法,帮助用户解决电脑开机黑屏不显示桌面的问题。方法一:重启Windows资源管理器打开任务管理器当电脑开机后遇到黑屏问题时,可以尝试按下键盘上的Ctrl+Shift+ESC组合键,打开任务管理器。任务管理器是Windows系
shiny如何监听非127.0.0.1的请求以及指定端口
rock——you
运维 前端 数据库
在Shiny服务器中,默认情况下,它只监听127.0.0.1(本地回环地址),这意味着外部设备无法访问。如果你希望Shiny监听外部请求(如局域网或公网),可以通过以下方法配置host选项。方法1:修改runApp()或shinyApp()的host参数默认情况下,Shiny服务器使用127.0.0.1作为host,你可以将其改为0.0.0.0,让它监听所有可用的网络接口。示例:使用runApp(
推荐:MacOS上的3D加速QEMU虚拟化神器
秋玥多
推荐:MacOS上的3D加速QEMU虚拟化神器去发现同类优质开源项目:https://gitcode.com/项目简介如果你是Mac用户,并且希望拥有一套完整的Linux开发或测试环境,那么这个项目将给你带来惊喜。基于AkihikoOdaki的开创性工作,它实现了在Mac上使用3D加速的QEMU虚拟机。项目以易于安装的Homebrew包形式提供,无论是Intel还是M1芯片的Mac电脑,都能享受到
Python | 学习type()方法动态创建类
胜天半月子
Python基础及应用 python 学习 开发语言
getattr方法的使用场景是在访问不存在的属性时,会触发该方法中的处理逻辑。尤其是在动态属性获取中结合type()动态创建类有着良好的使用关系。type()方法常用来判断属性的类别,而动态创建类不常使用,通过如下的几个实例来学习使用:defsay_hello(self):print("Hello,I'maninstanceofadynamicallycreatedclass!")#使用type函
Pytorch数据处理工具箱(后半部分)
不要不开心了
机器学习 神经网络 深度学习 人工智能 pytorch
今天的内容主要介绍了PyTorch中的数据处理工具箱及其相关工具的使用方法:1.DataLoader:-DataLoader用于批量处理数据,支持多线程加载数据。主要参数包括datase`(数据集)batch_size(批量大小)、shuffle(是否打乱数据)、num_workers(加载数据的线程数)等。DataLoader本身不是迭代器,但可以通过`iter`命令转换为迭代器。2.torch
An Iterative Technique for the Rectification of Observed Distributions 论文阅读
青铜锁00
论文阅读 论文阅读
AnIterativeTechniquefortheRectificationofObservedDistributions-L.B.Lucy1.研究目标与实际意义1.1研究目标1.2实际意义2.新方法与公式分析2.1核心思路:基于贝叶斯定理的迭代框架2.1.1贝叶斯逆概率公式2.1.2迭代更新规则2.1.3多维推广2.2方法优势2.3对比传统方法3.实验验证3.1数值实验设计3.2关键结果4.雷
Azimuth Superresolution of Forward-Looking Radar Imaging Which Relies on Linearized Bregman论文阅读
青铜锁00
论文阅读 Radar 论文阅读
AzimuthSuperresolutionofForward-LookingRadarImagingWhichReliesonLinearizedBregman1.论文的研究目标与意义1.1研究目标1.2实际应用意义2.论文提出的新方法、公式与优势(重点)2.1方法框架2.1.1贝叶斯建模2.1.2线性化Bregman算法2.2与传统方法的对比2.3公式总结3.实验设计与结果3.1点目标仿真3.
A Bayesian Angular Superresolution Method With Lognormal Constraint for Sea-Surface Target 论文阅读
青铜锁00
论文阅读 Radar 论文阅读
目录1.研究背景与问题2.方法创新3.关键优势4.实验验证5.与传统方法对比6.结论与意义1.研究背景与问题核心挑战:实孔径雷达受限于天线孔径尺寸,导致角分辨率不足,影响海面目标(如船舶)的精细化探测。传统方法局限性:谱估计方法(如MUSIC、IAA):依赖多快拍数据,机械扫描雷达难以满足。正则化方法(如TSVD、l1/l2约束):假设噪声服从高斯分布,未考虑海杂波的非高斯特性(如Rayleigh
HTML+CSS学习笔记
潘越越
学习 笔记
目录一、emmet语法二、常用html标签使用方法:三、常用CSS样式css样式设计具体引入方式1.关于border边框的设计2.关于text文本内容的管理3.关于盒模型的分类以及position属性:4.background属性的使用5.实现样式转变持续更新……首先,整体了解有关HTML和CSS的使用,主要是为了搭建静态页面有关HTML5所需要掌握的框架:React+Reactnativeuni
ArcGIS Pro SDK (九)几何 7 多点
Winemonk
ArcGIS Pro SDK arcgis arcgis pro sdk gis c#
ArcGISProSDK(九)几何7多点文章目录ArcGISProSDK(九)几何7多点1构造多点-从映射点的枚举2构造多点-使用MultipointBuilderEx3修改多点的点4从多点检索点、2D坐标、3D坐标环境:VisualStudio2022+.NET6+ArcGISProSDK3.01构造多点-从映射点的枚举//使用builderEx的便捷方法或者使用builderEx构造函数。Li
shell 获取目录下所有的文件夹名称
shijiazhenghu
服务器 linux 运维
运行shell后会输出/usr/目录下所有的文件夹的名字:#!/bin/bash#方法一dir=$(ls-l/usr/|awk'/^d/{print$NF}')foriin$dirdoecho$idone#方法二fordirin$(ls/usr/)do[-d$dir]&&echo$dirdone##方法三ls-l/usr/|awk'/^d/{print$NF}'##其实同方法一,直接就可以显示不用
网络基础 —HTTP与HTTPS的基本介绍
心随_风动
路由与交换 网络 http https
网络基础—HTTP与HTTPS的基本介绍前言1.HTTP的基本概念1.1什么是HTTP?1.2HTTP的工作原理1.3HTTP的特点1.4HTTP的常见方法2.HTTPS的基本概念2.1什么是HTTPS?2.2HTTPS的工作原理2.3HTTPS的特点2.4HTTPS的证书3.HTTP与HTTPS的区别4.为什么需要HTTPS?4.1数据安全性4.2防止中间人攻击4.3SEO优化4.4用户信任5.
APP自动化-模拟器使用
北条苒茗殇
自动化
前言:在一些不需要依赖手机蓝牙等硬件相关的测试时,可以使用模拟器来解决占用真机的问题。环境1、模拟器:Mumu模拟器(此处用Mumu为例子)2、ADB:1.0.41一、模拟器设置开启本地和远程连接二、ADB链接模拟器1、连接前点击多开器的右上角的ADB查看端口2、命令行输入adbconnect127.0.0.1:16384,出现connected即为连接成功三、uiauto.dev调试1、安装ui
本地大模型编程实战(09)自制聊天机器人(3)
火云牌神
AI编程实战 python langchain llama deepseek
文章目录准备自动裁剪聊天历史聊天机器人定义提示词模板定义state构建app测试流式输出总结代码本文将实现一个比较完善的聊天机器人的主要功能。包括:使用LangGraph构建聊天机器人自动裁剪聊天历史管理聊天会话的方法以流的方式输出回复我们将同时使用llama3.1和deepseek做演示。由于langchain可能对不同大模型支持程度不同以及其它限制,所以这个对比并不能说明哪个模型更好。准备在正
本地大模型编程实战(11)与外部工具交互(2)
火云牌神
AI编程实战 python langchain llama deepseek
文章目录准备定义工具方法创建提示词生成工具方法实参以`json`格式返回实参自定义`JsonOutputParser`返回`json`调用工具方法定义通用方法用链返回结果返回结果中包含工具输入总结代码在使用LLM(大语言模型)时,经常需要调用一些自定义的工具方法完成特定的任务,比如:执行一些特殊算法、查询天气预报、旅游线路等。很多大模型都具备使用这些工具方法的能力,Langchain也为这些调用提
探索Golang-WDA:iOS自动化测试的新星
花谦战
探索Golang-WDA:iOS自动化测试的新星gwdaWebDriverAgent(iOS)ClientLibraryinGolang项目地址:https://gitcode.com/gh_mirrors/gw/gwda在移动应用的开发与测试领域,自动化测试工具的选择至关重要。今天,我们将深入探讨一个新兴的开源项目——Golang-WDA,它以其独特的技术优势和广泛的应用场景,正逐渐成为iOS自
Recat学习
freelb
学习 webpack javascript reactjs
Recatv17.x项目开发框架搭建1.创建React项目2.暴露配置文件方法一方法二3.支持less4.支持scss/sass5.安装element-ui6.路由导航(常规使用)编译出错错误一错误二错误三错误四8.Serve插件(查看打包运行效果)安装typescript支持1.创建React项目为了加速npm下载速度,先把npm设置为淘宝镜像地址。npmconfigsetregistryhtt
iOS自归因详细介绍
AirZilong
ios 大数据 前端
iOS自归因详细介绍自归因(Self-Attribution)是指应用或广告平台通过分析用户行为数据,确定用户安装应用的来源渠道。在iOS生态中,由于隐私政策的限制(如AppTrackingTransparency,ATT),传统的归因方法(如IDFA)受到限制,因此自归因成为重要的替代方案。自归因的多种方案设备指纹(Fingerprinting)SKAdNetwork自定义URLScheme服务
本地大模型编程实战(25)用langgraph实现基于SQL数据构建的问答系统(4)
火云牌神
AI编程实战 sql langgraph LLM deepseek qwen
本文将演练使用基于langgraph链,对结构化数据库SQlite进行查询的方法。该系统建立以后,我们不需要掌握专业的SQL技能,可以用自然语言询问有关数据库中数据的问题并返回答案。使大语言模型(LLM)查询结构化数据与非结构化文本数据有所不同。查询非结构化数据时,通常需要将待查询的文本嵌入到向量数据库中;而查询结构化数据的方法则是让LLM编写和执行DSL(例如SQL)进行查询。在用langcha
C++ unordered_map与unordered_set的模拟实现
康熙38bdc
C++ c++ 算法 开发语言
目录0.前言1.哈希表(HashTable)设计1.1设计思想1.2HashTable.h1.3设计思路2.unordered_map封装2.1UnorderedMap.h2.2代码解释2.3测试函数3.unordered_set封装3.1UnorderedSet.h3.2代码解释3.3测试函数4.结语(图像由AI生成)0.前言在C++标准库中,unordered_map和unordered_se
SSH 密钥验证失败,GitHub 无法识别你的 SSH 公钥
weixin_74979678
ssh github 运维
目录**1.检查SSH密钥是否正确添加到GitHub**1.**检查本地SSH密钥**:-确保你已经生成了SSH密钥。默认情况下,公钥文件位于`2.**将公钥添加到GitHub**:3.**测试SSH连接**:**2.检查SSH配置**1.**检查默认密钥文件**:2.**检查SSH代理**:3.**检查权限**:**3.确保仓库存在****4.使用HTTPS克隆(作为临时解决方案)****5.其
uview2.0封装http请求实战以及常见请求传参实录
卖柴火的小伙子
http 前端 uview2.0 uniapp post传参
1.前言2.使用步骤2.1配置请求拦截器以及api集中管理配置2.2main.js中进行引入请求拦截器2.3页面中引入请求方法并使用1.前言uview2.0是uniapp开发中使用频率相对来讲比较高的一款框架,今天从实战角度介绍一下关于http请求uview是如何进行封装.该插件支持post、get、put和delete,以及上传下载等请求,有如下特点:基于Promise对象实现更简单的reque
YOLOv8 赋能道路状况检测:革新交通基础设施监测
他是只猫
YOLOv8 在交通领域的应用 YOLO 目标跟踪 人工智能
文章目录一、YOLOv8在道路状况检测中的原理与优势(一)检测原理(二)相较于传统方法的优势二、YOLOv8在道路状况检测中的具体应用实例(一)裂缝检测(二)坑洼检测(三)积水检测三、基于YOLOv8的道路状况检测流程(一)图像采集(二)数据预处理(三)模型训练与评估(四)检测与结果输出四、YOLOv8用于道路状况检测面临的挑战与应对策略(一)面临的挑战(二)应对策略五、基于YOLOv8的道路状况
yolo位姿估计实验
jarreyer
YOLO
目录介绍实验过程2.1数据集下载2.2模型和数据配置文件修改2.3模型训练参考链接1.介绍1.1简介YOLOv8-Pose是基于YOLOv4算法的姿势估计模型,旨在实现实时高效的人体姿势估计。姿势估计在计算机视觉领域具有重要意义,可广泛应用于视频监控、运动分析、健康管理等领域。1.2背景传统的姿势估计方法常需复杂网络架构和大量计算资源,导致实时性不佳。YOLOv8-Pose通过对YOLOv4算法进
mongodb3.03开启认证
21jhf
mongodb
下载了最新mongodb3.03版本,当使用--auth 参数命令行开启mongodb用户认证时遇到很多问题,现总结如下:
(百度上搜到的基本都是老版本的,看到db.addUser的就是,请忽略)
Windows下我做了一个bat文件,用来启动mongodb,命令行如下:
mongod --dbpath db\data --port 27017 --directoryperdb --logp
【Spark103】Task not serializable
bit1129
Serializable
Task not serializable是Spark开发过程最令人头疼的问题之一,这里记录下出现这个问题的两个实例,一个是自己遇到的,另一个是stackoverflow上看到。等有时间了再仔细探究出现Task not serialiazable的各种原因以及出现问题后如何快速定位问题的所在,至少目前阶段碰到此类问题,没有什么章法
1.
package spark.exampl
你所熟知的 LRU(最近最少使用)
dalan_123
java
关于LRU这个名词在很多地方或听说,或使用,接下来看下lru缓存回收的实现
1、大体的想法
a、查询出最近最晚使用的项
b、给最近的使用的项做标记
通过使用链表就可以完成这两个操作,关于最近最少使用的项只需要返回链表的尾部;标记最近使用的项,只需要将该项移除并放置到头部,那么难点就出现 你如何能够快速在链表定位对应的该项?
这时候多
Javascript 跨域
周凡杨
JavaScript jsonp 跨域 cross-domain
linux下安装apache服务器
g21121
apache
安装apache
下载windows版本apache,下载地址:http://httpd.apache.org/download.cgi
1.windows下安装apache
Windows下安装apache比较简单,注意选择路径和端口即可,这里就不再赘述了。 2.linux下安装apache:
下载之后上传到linux的相关目录,这里指定为/home/apach
FineReport的JS编辑框和URL地址栏语法简介
老A不折腾
finereport web报表 报表软件 语法总结
JS编辑框:
1.FineReport的js。
作为一款BS产品,browser端的JavaScript是必不可少的。
FineReport中的js是已经调用了finereport.js的。
大家知道,预览报表时,报表servlet会将cpt模板转为html,在这个html的head头部中会引入FineReport的js,这个finereport.js中包含了许多内置的fun
根据STATUS信息对MySQL进行优化
墙头上一根草
status
mysql 查看当前正在执行的操作,即正在执行的sql语句的方法为:
show processlist 命令
mysql> show global status;可以列出MySQL服务器运行各种状态值,我个人较喜欢的用法是show status like '查询值%';一、慢查询mysql> show variab
我的spring学习笔记7-Spring的Bean配置文件给Bean定义别名
aijuans
Spring 3
本文介绍如何给Spring的Bean配置文件的Bean定义别名?
原始的
<bean id="business" class="onlyfun.caterpillar.device.Business">
<property name="writer">
<ref b
高性能mysql 之 性能剖析
annan211
性能 mysql mysql 性能剖析 剖析
1 定义性能优化
mysql服务器性能,此处定义为 响应时间。
在解释性能优化之前,先来消除一个误解,很多人认为,性能优化就是降低cpu的利用率或者减少对资源的使用。
这是一个陷阱。
资源时用来消耗并用来工作的,所以有时候消耗更多的资源能够加快查询速度,保持cpu忙绿,这是必要的。很多时候发现
编译进了新版本的InnoDB之后,cpu利用率上升的很厉害,这并不
主外键和索引唯一性约束
百合不是茶
索引 唯一性约束 主外键约束 联机删除
目标;第一步;创建两张表 用户表和文章表
第二步;发表文章
1,建表;
---用户表 BlogUsers
--userID唯一的
--userName
--pwd
--sex
create
线程的调度
bijian1013
java 多线程 thread 线程的调度 java多线程
1. Java提供一个线程调度程序来监控程序中启动后进入可运行状态的所有线程。线程调度程序按照线程的优先级决定应调度哪些线程来执行。
2. 多数线程的调度是抢占式的(即我想中断程序运行就中断,不需要和将被中断的程序协商)
a)
查看日志常用命令
bijian1013
linux 命令 unix
一.日志查找方法,可以用通配符查某台主机上的所有服务器grep "关键字" /wls/applogs/custom-*/error.log
二.查看日志常用命令1.grep '关键字' error.log:在error.log中搜索'关键字'2.grep -C10 '关键字' error.log:显示关键字前后10行记录3.grep '关键字' error.l
【持久化框架MyBatis3一】MyBatis版HelloWorld
bit1129
helloworld
MyBatis这个系列的文章,主要参考《Java Persistence with MyBatis 3》。
样例数据
本文以MySQL数据库为例,建立一个STUDENTS表,插入两条数据,然后进行单表的增删改查
CREATE TABLE STUDENTS
(
stud_id int(11) NOT NULL AUTO_INCREMENT,
【Hadoop十五】Hadoop Counter
bit1129
hadoop
1. 只有Map任务的Map Reduce Job
File System Counters
FILE: Number of bytes read=3629530
FILE: Number of bytes written=98312
FILE: Number of read operations=0
FILE: Number of lar
解决Tomcat数据连接池无法释放
ronin47
tomcat 连接池 优化
近段时间,公司的检测中心报表系统(SMC)的开发人员时不时找到我,说用户老是出现无法登录的情况。前些日子因为手头上 有Jboss集群的测试工作,发现用户不能登录时,都是在Tomcat中将这个项目Reload一下就好了,不过只是治标而已,因为大概几个小时之后又会 再次出现无法登录的情况。
今天上午,开发人员小毛又找到我,要我协助将这个问题根治一下,拖太久用户难保不投诉。
简单分析了一
java-75-二叉树两结点的最低共同父结点
bylijinnan
java
import java.util.LinkedList;
import java.util.List;
import ljn.help.*;
public class BTreeLowestParentOfTwoNodes {
public static void main(String[] args) {
/*
* node data is stored in
行业垂直搜索引擎网页抓取项目
carlwu
Lucene Nutch Heritrix Solr
公司有一个搜索引擎项目,希望各路高人有空来帮忙指导,谢谢!
这是详细需求:
(1) 通过提供的网站地址(大概100-200个网站),网页抓取程序能不断抓取网页和其它类型的文件(如Excel、PDF、Word、ppt及zip类型),并且程序能够根据事先提供的规则,过滤掉不相干的下载内容。
(2) 程序能够搜索这些抓取的内容,并能对这些抓取文件按照油田名进行分类,然后放到服务器不同的目录中。
[通讯与服务]在总带宽资源没有大幅增加之前,不适宜大幅度降低资费
comsci
资源
降低通讯服务资费,就意味着有更多的用户进入,就意味着通讯服务提供商要接待和服务更多的用户,在总体运维成本没有由于技术升级而大幅下降的情况下,这种降低资费的行为将导致每个用户的平均带宽不断下降,而享受到的服务质量也在下降,这对用户和服务商都是不利的。。。。。。。。
&nbs
Java时区转换及时间格式
Cwind
java
本文介绍Java API 中 Date, Calendar, TimeZone和DateFormat的使用,以及不同时区时间相互转化的方法和原理。
问题描述:
向处于不同时区的服务器发请求时需要考虑时区转换的问题。譬如,服务器位于东八区(北京时间,GMT+8:00),而身处东四区的用户想要查询当天的销售记录。则需把东四区的“今天”这个时间范围转换为服务器所在时区的时间范围。
readonly,只读,不可用
dashuaifu
js jsp disable readOnly readOnly
readOnly 和 readonly 不同,在做js开发时一定要注意函数大小写和jsp黄线的警告!!!我就经历过这么一件事:
使用readOnly在某些浏览器或同一浏览器不同版本有的可以实现“只读”功能,有的就不行,而且函数readOnly有黄线警告!!!就这样被折磨了不短时间!!!(期间使用过disable函数,但是发现disable函数之后后台接收不到前台的的数据!!!)
LABjs、RequireJS、SeaJS 介绍
dcj3sjt126com
js Web
LABjs 的核心是 LAB(Loading and Blocking):Loading 指异步并行加载,Blocking 是指同步等待执行。LABjs 通过优雅的语法(script 和 wait)实现了这两大特性,核心价值是性能优化。LABjs 是一个文件加载器。RequireJS 和 SeaJS 则是模块加载器,倡导的是一种模块化开发理念,核心价值是让 JavaScript 的模块化开发变得更
[应用结构]入口脚本
dcj3sjt126com
PHP yii2
入口脚本
入口脚本是应用启动流程中的第一环,一个应用(不管是网页应用还是控制台应用)只有一个入口脚本。终端用户的请求通过入口脚本实例化应用并将将请求转发到应用。
Web 应用的入口脚本必须放在终端用户能够访问的目录下,通常命名为 index.php,也可以使用 Web 服务器能定位到的其他名称。
控制台应用的入口脚本一般在应用根目录下命名为 yii(后缀为.php),该文
haoop shell命令
eksliang
hadoop hadoop shell
cat
chgrp
chmod
chown
copyFromLocal
copyToLocal
cp
du
dus
expunge
get
getmerge
ls
lsr
mkdir
movefromLocal
mv
put
rm
rmr
setrep
stat
tail
test
text
MultiStateView不同的状态下显示不同的界面
gundumw100
android
只要将指定的view放在该控件里面,可以该view在不同的状态下显示不同的界面,这对ListView很有用,比如加载界面,空白界面,错误界面。而且这些见面由你指定布局,非常灵活。
PS:ListView虽然可以设置一个EmptyView,但使用起来不方便,不灵活,有点累赘。
<com.kennyc.view.MultiStateView xmlns:android=&qu
jQuery实现页面内锚点平滑跳转
ini
JavaScript html jquery html5 css
平时我们做导航滚动到内容都是通过锚点来做,刷的一下就直接跳到内容了,没有一丝的滚动效果,而且 url 链接最后会有“小尾巴”,就像#keleyi,今天我就介绍一款 jquery 做的滚动的特效,既可以设置滚动速度,又可以在 url 链接上没有“小尾巴”。
效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/37.htmHTML文件代码:
&
kafka offset迁移
kane_xie
kafka
在早前的kafka版本中(0.8.0),offset是被存储在zookeeper中的。
到当前版本(0.8.2)为止,kafka同时支持offset存储在zookeeper和offset manager(broker)中。
从官方的说明来看,未来offset的zookeeper存储将会被弃用。因此现有的基于kafka的项目如果今后计划保持更新的话,可以考虑在合适
android > 搭建 cordova 环境
mft8899
android
1 , 安装 node.js
http://nodejs.org
node -v 查看版本
2, 安装 npm
可以先从 https://github.com/isaacs/npm/tags 下载 源码 解压到
java封装的比较器,比较是否全相同,获取不同字段名字
qifeifei
非常实用的java比较器,贴上代码:
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
i
记录一些函数用法
.Aky.
位运算 PHP 数据库 函数 IP
高手们照旧忽略。
想弄个全天朝IP段数据库,找了个今天最新更新的国内所有运营商IP段,copy到文件,用文件函数,字符串函数把玩下。分割出startIp和endIp这样格式写入.txt文件,直接用phpmyadmin导入.csv文件的形式导入。(生命在于折腾,也许你们觉得我傻X,直接下载人家弄好的导入不就可以,做自己的菜鸟,让别人去说吧)
当然用到了ip2long()函数把字符串转为整型数
sublime text 3 rust
wudixiaotie
Sublime Text
1.sublime text 3 => install package => Rust
2.cd ~/.config/sublime-text-3/Packages
3.mkdir rust
4.git clone https://github.com/sp0/rust-style
5.cd rust-style
6.cargo build --release
7.ctrl