我希望有很多很多的爱,如果没有很多的爱,我希望有很多很多的钱;没有很多的钱,我希望拥有健康! I am like the road in the night listening to the footfalls of its memories in silence.

发布新日志

  • Java: Map例子

    2016-02-22 16:51:57

    掌握Map接口与Collection接口不同
    掌握Map与Map.Entry接口的关系
    掌握Map接口的常用子类:HashMap、HashTable、TreeMap、WeekHashMap
    掌握HashMap与HashTable的区别


    3、具体内容

    Collection的操作中之前已经发现,每次保存对象都一个对象,但是在Map中保存是的一对对象,对象的形式是以:key->value的形式保存的。
    就好像电话本:张三->123456

    Map接口中的方法

    No.    方法或类                    类型    描述
    1    public void clear()                普通    清空Map集合
    2    public boolean containsKey(Object key)        普通    判断指定的key是否存在
    3    public boolean containsValue(Object value)    普通    判断指定的value是否存在
    4    public Set<Map.Entry<K,V>> entrySet()        普通    将Map对象变为Set集合
    5    public boolean equals(Object o)            普通    对象比较
    6    public V get(Object K)                普通    根据key获得value
    7    public int hashCode()                普通    返回哈希码
    8    public boolean isEmpty()            普通    判断集合是否为空
    9    public Set<K> keySet()                普通    取得所有的key
    10    public V put(K key,V value)            普通    向集合中加入元素
    11    public void putAll(Map<? extends K,extends V> t)普通    将一个Map集合中的内容加入到别一个Map
    12    public V remove(Object key)            普通    根据key删除value
    13    public int size()                普通    取得集合长度
    14    public Collection<V> values()            普通    取得全部的value


    Map接口的常用子类:
    HashMap:无序存放的,是新的操作类,key不允许重复。
    Hashtable:无序存放的,是旧的操作类,key不允许重复。
    TreeMap:可以排序的Map集合,按集合中的key排序,key不允许重复。
    WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时,可以清楚掉无用的数据,可以使用gc进行回收。
    IdentityHashMap:key可以重复的Map集合。

    Map与Map.entry的关系:


    代码例子:
     

    package Intf.study;

     

    import java.util.Collection;

    import java.util.HashMap;

    import java.util.Map;

    import java.util.Set;

     

     

    public class intfTest {

     

        public static void main(String[] args) {

     

           // 一个key需要保存多个value的时候就需要使用到这个IdentityHashMap

     

           // 1段代码,Map不指定类型与指定类型

           System.out.println("*************1段代码:");

           // Map:里面存放的是键值对集合,键值对的类型可以是任意封装类型,:

           //Map()相当于Map<Object,Object>.,这个是指装入的键是对象类型,装入的值是对象类型

           //value对象通过toString转换为字符串,再转换成其他的类型,如Intdate

           Map map_t1 = new HashMap();

           // 以下的俩种使用方式都是对的

           map_t1.put("a", 1);

           map_t1.put(11, "abc");

           // Map<key,value>:里面存放的也是键值对集合,但是类型只能是<>中指定的类型

           Map<String, Integer> map_t2 = new HashMap<String, Integer>();

           map_t2.put("a", 1); // 正确使用方式

           // map_t2.put(11,"abc"); //错误使用方式,会导致无法通过编译

           int int_t=map_t2.get("a");//Map指定了类型,那么可直接获取类型值,而不是object

           System.out.println("int_t=" +int_t); // 打印对象

     

           // 2段代码,取value值的方法,包括转换为数值、日期

           System.out.println("*************2段代码:");

          

           Map map = new HashMap(); // 声明一个Map

           map.put("sa_str", "abc"); // map中放值 ,注意: mapkey-value的形式存放的

           map.put("sb_int", 50); // 放非字符串的值

           String str = map.get("sa_str").toString(); // map中取值

                                                  // ,注意:不能写成map.get("sa"),因为后者返回是object类型

           System.out.println("map值字符串sa_str=" + str);

     

           String str2 = map.get("sb_int").toString(); //整数value先转换为字符串

           int a=Integer.parseInt(str2);  //再通过字符串转换为整数

           System.out.println("map值整数=" + a);

     

           Object get = map.get("sa_str"); // 获取指定键所映射的值,value值是一个对象类型

           System.out.println("打印对象get=" + get); // 打印对象

           if (get instanceof String) { // 判断键值是否为String类型

               String value = (String) get; // 获取指定的value

               System.out.println("Map集合中键名sa_str的键值是:" + value); // value值输出

           }

          

           String key1 = "caterpillar";

           String key2 = "justin";

           map.put(key1, "caterpillar的讯息");

           map.put(key2, "justin的讯息");

           System.out.println(map.get(key1));

           System.out.println(map.get(key2));

       

           // 3段代码, 改变value值、删除某Key元素、清空map(重新初始化)

           System.out.println("*************3段代码:");

       

           map.put(key1, "123456789");

  • java: 集合使用方法(list、map、set、queue)

    2016-02-22 16:51:57

    前言

      在java中提供给我们了一些类似C++泛型的简单集合,list,set,map等。这里,简单介绍一下这些集合容器的使用方法,以及复杂对象元素的自定义排序。

      首先看一下集合的框架图:

      由于collection也继承了Iterator和comparable接口,因此我们可以使用Iterator来遍历元素,也可以通过自定义compareTo函数来重新编写自己的排序。

     

    代码例子参考:

    http://blog.csdn.net/e421083458/article/details/8542536

  • JAVA集合详解(Collection和Map接口) [转]

    2016-02-22 16:51:57

    在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父子关系: 
               java.util
            +Collection 这个接口extends自 --java.lang.Iterable接口
               +List 接口 
                  -ArrayList 类
                  -LinkedList 类
                  -Vector 类     此类是实现同步的

               +Queue 接口
                  +不常用,在此不表.

               +Set 接口
                  +SortedSet 接口
                     -TreeSet 类
                  -HashSet

            +Map 接口
              -HashMap 类 (除了不同步和允许使用 null 键/值之外,与 Hashtable 大致相同.)
              -Hashtable 类 此类是实现同步的,不允许使用 null 键值
              +SortedMap 接口
                 -TreeMap 类

              以下对众多接口和类的简单说明:首先不能不先说一下数组(Array)
           一、Array , Arrays

    Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。

    1、
    效率高,但容量固定且无法动态改变。
    array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。

    2、Java中有一个Arrays类,专门用来操作array。
           arrays中拥有一组static函数,
    equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
    fill():将值填入array中。
    sort():用来对array进行排序。
    binarySearch():在排好序的array中寻找元素。
    System.arraycopy():array的复制。


    二、Collection , Map

    若撰写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。

    1、Collection 和 Map 的区别

    容器内每个为之所存储的元素个数不同。
    Collection类型者,每个位置只有一个元素。
    Map类型者,持有 key-value pair,像个小型数据库。

    2、Java2容器类类库的用途是“保存对象”,它分为两类,各自旗下的子类关系

    Collection
           --List:将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。
                 --ArrayList / LinkedList / Vector
           --Set : 不能含有重复的元素
                 --HashSet /TreeSet
    Map
           --HashMap
        --HashTable
        --TreeMap

     Map----一组成对的“键值对”对象,即其元素是成对的对象,最典型的应用就是数据字典,并且还有其它广泛的应用。另外,Map可以返回其所有键组成的Set和其所有值组成的Collection,或其键值对组成的Set,并且还可以像数组一样扩展多维Map,只要让Map中键值对的每个“值”是一个Map即可。

     Collection下 1.迭代器

      迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

      Java中的Iterator功能比较简单,并且只能单向移动:

      (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。


      (2) 使用next()获得序列中的下一个元素。

      (3) 使用hasNext()检查序列中是否还有元素。

      (4) 使用remove()将迭代器新返回的元素删除。

      Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

      2.List的功能方法

      List(interface): 次序是List最重要的特点;它确保维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(只推荐LinkedList使用)。一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和删除元素。

      ArrayList: 由数组实现的List。它允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和删除元素,因为这比LinkedList开销要大很多。

      LinkedList: 由列表实现的List。对顺序访问进行了优化,向List中间插入与删除得开销不大,随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

      3.Set的功能方法

      Set(interface): 存入Set的每个元素必须是唯一的,这也是与List不同的,因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

      HashSet: HashSet能快速定位一个元素,存入HashSet的对象必须定义hashCode()。

      TreeSet: 保持次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。

      LinkedHashSet: 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

      HashSet采用散列函数对元素进行排序,这是专门为快速查询而设计的;TreeSet采用红黑树的数据结构进行排序元素;LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的次序,使得看起来元素是以插入的顺序保存的。需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。

    3、其他特征

    *     List,Set,Map将持有对象一律视为Object型别。
    *     Collection、List、Set、Map都是接口,不能实例化。
          继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化。
    *     vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。


    三、Collections

    Collections是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。
    相当于对Array进行类似操作的类——Arrays。
    如,Collections.max(Collection coll); 取coll中最大的元素。
           Collections.sort(List list); 对list中元素排序


    四、如何选择?

    1、容器类和Array的区别、择取
          *     容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。
          *     一旦将对象置入容器内,便损失了该对象的型别信息。

    2、
         *     在各种Lists中,最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList();
            Vector总是比ArrayList慢,所以要尽量避免使用。
         *     在各种Sets中,HashSet通常优于HashTree(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。
            HashTree存在的唯一理由:能够维护其内元素的排序状态。
         *     在各种Maps中
            HashMap用于快速查找。
         *     当元素个数固定,用Array,因为Array效率是最高的。


    结论:最常用的是ArrayList,HashSet,HashMap,Array。而且,我们也会发现一个规律,用TreeXXX都是排序的。


    注意:

    1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。
    2、Set和Collection拥有一模一样的接口。
    3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get)
    4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。

    5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。
          HashMap会利用对象的hashCode来快速找到key。
        *     hashing
              哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。
              我们都知道所有存储结构中,array查找速度是最快的。所以,可以加速查找。
          
              发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。

    6、Map中元素,可以将key序列、value序列单独抽取出来。
    使用keySet()抽取key序列,将map中的所有keys生成一个Set。
    使用values()抽取value序列,将map中的所有values生成一个Collection。

    为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。


  • Java:数组

    2016-02-19 16:57:22

     1、数组可以有多维数组,并且数组处理有很多自带函数

    2、数据还可以用三维数组、多维数组

     

     

    package Intf.study;

     

     

    public class intfTest {

     

        public static void main(String[] args) {

     

           String[] aArray = new String[5];

           String[] bArray = { "a", "b", "c", "d", "e" };

           String[] cArray = new String[] { "a", "b", "c", "d", "e" };

           int i = 0;

           int j = 0;

           int m=0;

     

           // aArray = {"a","b","c", "d", "e"}; //不允许 ,报错

           aArray[0] = "a";

           aArray[1] = "b";

           aArray[2] = "c";

           aArray[3] = "d";

           aArray[4] = "e";

           for (i = 0; i < aArray.length; i++) { // 数组下标是从 0开始的

               System.out.printf(aArray[i] + ", ");

           }

     

           System.out.println("         ");

     

           int[] intArray = { 1, 2, 3, 4, 5 };

           int[] intArray2 = new int[5];

           intArray2 = intArray; // 数组可以直接赋值

           for (i = 0; i < intArray2.length; i++) {

               System.out.printf(intArray2[i] + ", ");

           }

           System.out.println("                ");

     

           // 数据有有很多相关自带函数处理

           if (intArray.equals(intArray2) == true) {

               System.out.println("数组A.equals(数组B)函数比较 两个数据是否相等 ");

           }

     

           // 二维数组

           int[][] mylist = new int[2][3];

           for (i = 0; i < 2; i++) { // 赋值

               for (j = 0; j < 3; j++) {

                  mylist[i][j] = m;

                  m=m+1;

               }

           }

     

           for (i = 0; i < 2; i++) { // 打印

               for (j = 0; j < 3; j++) {

                  System.out.printf(mylist[i][j] + ", ");

                  if (j == 2) {

                      System.out.println("             ");

                  }

               }

           }

     

        }

     

    }

     

     

     

     
  • Java: 数字与字符串,相互转换的方法

    2016-02-19 14:19:59

    我的说明:

    一、数字与字符串,相互转换的方法有如下这些,特别注意的是,不管使用哪种方法,字符串为空或者数字未初始化都是不允许的,编译或运行中会报错

    二、自己实例中,值得学习第5小段代码

     

    1如何将字串 String 转换成整数 int?

      A. 有两个方法:  //两种方法第1种比较方便,第2种需要建立Integer对象,并且对象函数最终是用第一种方式的

      1). int i = Integer.parseInt([String]); 或

      i = Integer.parseInt([String],[int radix]);

      2). int i = Integer.valueOf(my_str).intValue();

      注: 字串转成 Double, Float, Long 的方法大同小异.

      2 如何将整数 int 转换成字串 String ?

      A. 有叁种方法:  //其中第2、3种比较方便,可以同时支持多种数字类型,而第1种则需要建立相应的数字字符串类型对象

      1.) String s = String.valueOf(i);

      2.) String s = Integer.toString(i);

      3.) String s = "" + i;

      注: Double, Float, Long 转成字串的方法大同小异.

     

    自己实例

     

    package Intf.study;

     

    import java.text.DecimalFormat; //格式化字符串 的对象类

     

    public class intfTest {

     

        public static void main(String[] args) {

     

           String s = "123.456";

           String s2="789";      

          

           // 1段代码

           double d = Double.parseDouble(s);

           float f = Float.parseFloat(s);

           System.out.println("d=" + d);

           System.out.println("f=" + f);

     

           // 2段代码,整数字符串可直接转换为int

           int j = Integer.parseInt(s2);// 整数字符串可以直接转化成整形

           System.out.println("j=" + j);

          

     

           // 3段代码,指定格式,之后再将带小数点变通转换为int

           // int i = Integer.parseInt(s); //报错,带小数点字符串不能直接转换为整数

           // int i = d; //长度大的值不能赋值给长度短的

           double h=Double.parseDouble(s);

           DecimalFormat df = new DecimalFormat();

           df.applyLocalizedPattern("####.#");//只输出一个小数点

           String Double_str = df.format(h);  // double按照指定个数输出字符串

           System.out.println("指定小数点位数字符串输出Double_str=" + Double_str);

     

           df.applyLocalizedPattern("####"); //只输出整数

           String int_str = df.format(h);

           System.out.println("只输出整数字符串int_str=" + int_str);

     

           Integer integer;

           integer = Integer.valueOf(int_str);

            int k1=integer.intValue(); // 整数字符串 转换为整数

        int k2 = Integer.valueOf(int_str).intValue();

            System.out.println("输出整数k1=" + k1);

            System.out.println("输出整数k2=" + k2);

       

         // 4段代码,数字转换为字符串

    /*

            1.) String s = String.valueOf(i);

           2.) String s = Integer.toString(i);

           3.) String s = "" + i;

           注: Double, Float, Long 转成字串的方法大同小异.

    */

            String s_t1 = String.valueOf(963.63); //数字可以整数 、也可以带小树

            System.out.println("s_t1=" + s_t1);

           

            String s_t2 = "" + 741.41; //数字可以整数 、也可以带小树

            System.out.println("s_t2=" + s_t2);

           

            Integer integer2 = new Integer(852);  //数字只能是整数

            String s_t3 = integer2.toString();

            System.out.println("s_t3=" + s_t3);

           

           Float floatee = new Float(852.52); //小数点的数字的转换

           String s_t4 = floatee.toString();

           System.out.println("s_t4=" + s_t4);

     

     

           //5段代码 ,为了避免报错,做异常的处理

           Integer price = null;

           String STR="789.45";

           try {

               price = Integer.parseInt(STR);

           } catch (Exception e) {

               e.printStackTrace();

           }

           if (price == null) {

               System.out.println("数字格式错误");

           }

          

        }

    }

     

    运行输出:

    d=123.456
    f=123.456
    j=789
    指定小数点位数字符串输出Double_str=123.5
    只输出整数字符串int_str=123
    输出整数k1=123
    输出整数k2=123
    s_t1=963.63
    s_t2=741.41
    s_t3=852
    s_t4=852.52
    数字格式错误

     

     

    这是一个例子,说的是JAVA中数据数型的转换.供大家学习引

     

    package cn.com.lwkj.erts.reGISter;

     

    import java.sql.Date;

     

  • Java: 时间与字符串,相互转换的方法

    2016-02-18 16:55:14

     

     

     

    package Intf.study;

     

    import java.util.Date;

    import java.text.SimpleDateFormat;

    import java.util.Calendar;

    import java.text.ParseException;

     

    public class intfTest {

     

        public static void main(String[] args) {

     

           // 1段代码

           SimpleDateFormat df1 = new SimpleDateFormat();// 没有设置日期格式

           System.out.println("1段代码输出=" + df1.format(new Date()));// new

                                                            // Date()为获取当前系统时间

     

           // 2段代码

           SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式

           System.out.println("2段代码输出=" + df2.format(new Date()));// new

                                                            // Date()为获取当前系统时间

     

           // 2.1段代码

           SimpleDateFormat sdf = new SimpleDateFormat(" yyyyMMdd ");

           String str = sdf.format(new Date());

           System.out.println("2.1段代码=" + str);

     

           // 3段代码

           Date now = new Date(); // 获取当前系统时间

           SimpleDateFormat df3 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");// 可以方便地修改日期格式

           String now_str = df3.format(now);

           System.out.println("3段代码原始日前输出=" + now);

           System.out.println("3段代码转换为指定格式的字符串日期输出=" + now_str);

     

           // 4段代码,对时间拆分为年、月、日、时、分、秒

           Calendar c = Calendar.getInstance();// 可以对每个时间域单独修改

           int year = c.get(Calendar.YEAR);

           int month = c.get(Calendar.MONTH);

           int date = c.get(Calendar.DATE);

           int hour = c.get(Calendar.HOUR_OF_DAY);

           int minute = c.get(Calendar.MINUTE);

           int second = c.get(Calendar.SECOND);

           String str2 = year + "/" + month + "/" + date + " " + hour + ":"

                  + minute + ":" + second;

           System.out.println("4段代码输出=" + str2);

     

           // 5段代码,字符串转换为日期

           String str3 = "2008-07-10 19:20:00";

           SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

           Date date2 = null;

           try {

               date2 = format.parse(str3); // 将字符串转换为日期

           } catch (ParseException e) {

               e.printStackTrace();

           }

           System.out.println("5段代码输出=" + date2);

     

        }

    }

     

     

     

    运行输出结果:

     

    第1段代码输出=16-2-18 下午4:52
    第2段代码输出=2016-02-18 16:52:21
    第2.1段代码= 2016年02月18日
    第3段代码原始日前输出=Thu Feb 18 16:52:21 CST 2016
    第3段代码转换为指定格式的字符串日期输出=2016/02/18 16:52:21
    第4段代码输出=2016/1/18 16:52:21
    第5段代码输出=Thu Jul 10 19:20:00 CST 2008

     

  • Java:接口应用例子

    2016-02-17 11:13:03

    多态有3个条件 

    1:继承 

    2:重写(重写父类继承的方法) 

    3:父类引用指向字类对象

    实例如下:

    interface  Parent 
            String  method(); //注意:接口方法内不能些逻辑
    }
     
    class  Child1  implements  Parent 
            public  String  method() 
            
                    return  "Child1 "
            
    }
     
    class  Child2  implements  Parent 
            public  String  method() 
            
                    return  "Child2 "
            
    }
     
    public  class  Test 
            public  static  void  main(String[]  args) 
            
                    //ME: 这个例子中,定义的对象类似是接Parent,但其他的例子用,定的子类对象,并且在多继承中,也只有子类对象了  
                    Parent  parent  =  new  Child1(); 
                    System.out.println(parent.method()); 
                    parent  =  new  Child2();    
                    System.out.println(parent.method()); 
            
    }
     

    只有多个子类从一个父类继承或实现一个接口。  在建立这些子类实例时,都用父类或接口做为变量类型,如上例中的parent。也就


    是说,用户对应的接口都是一个Parent。而由于new后面的子类不同,而产生调用同一个方法method返回不同结果的显现叫多态。就


    是同一个方法在使用不同子类时有不同的表现(在这里是不同的返回值)。

  • Java: 接口interface的作用

    2016-02-17 11:13:03

    Java 中的接口有什么作用?

    例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂不是更便捷,还省去了定义接口?接口在java中的作用是什么?个人觉得只是一种规范。大家的看法呢?
     
    答复一:
     
    接口是个规范”,这句没错。
    不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?

    既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。

    统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做
    比如说:
    我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?
    数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。
     
    然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。
    这两个对象是什么类型呢?
    Object a,b?肯定不行,a > b 这样的语法无法通过编译。
    int a,b?也不行?一开始就说了,不一定是数字。
    ....
    所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。
    所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。
    因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。

    如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口了。
     
    答复二:
    接口在开发过程中可以快速分离工作内容。
    比如调用者在写业务逻辑的时候需要一个功能,可能是数据库访问,或者复杂计算,但是他的工作专注于实现业务逻辑,不想分开精力去做底层实现,那么他只需要先实现一个接口,定义了规范,然后就可以继续他的业务逻辑代码了。
    而实现者可以根据这个接口规范,做具体的实现。
    这样通过使用接口就可以快速的分离工作内容,达到团队并行工作的目的。

    此外,如果规范是通过接口定义的,那么当你这个功能有多个实现时,你只要实现了这个接口,那么可以快速的替换具体实现,做到代码层面的完全可以分离。

    总结起来就一句话:接口或者规范可以在开发过程中做到分离。

  • Java: 特殊语法要求和编码规范的要求

    2016-02-17 10:08:41

     
     
     
    1、包名称、类名称、函数名称、变量名称等,不能包含有关键字的字眼,如import\package\class等,否则在Eclipse中定义包或者类中,finish按钮和next按钮都不可用,而在程序代码中,编译和运行都不通过。
     
    2、Java编码中是区分大小写的,int a和 int A, a与A是不同的变量。
     
    3、变量运算前,必须初始化,否则编译报错或者运行时报错,如下面这段代码,第2、3行都是会报错说没有初始化。
        int a,b,c;
        c=a+b;
        countAandB(a, b); //函数内是a+b运算
     
    4、代码注释用//,多行注释用/*代码*/,类注释建议用/**类*/
     
    5、同一个.java文件中可以定义多个类,即使在Eclipse中创建出一个类的.java文件,我们也可以在该文件中继续编写定义其他的类,但只允许一个public类是跟文件名称相同的。
     
    5.1、一个工程空间(workspace)其实是相当于一个硬盘的一个文件夹,同一个工程空间中可以有多个工程(project),但为了使工程空间加载打开慢,建议一个工程空间下只放一个工程
     
    6、为了代码整齐好看,可以在Eclipse的菜单“source->formater"进行格式处理,或者直接使用ctrl+shift+F按键。
     
    7、switch语句中,必须包含default语句。

    8、常量命名应使用CONSTANT_CASE格式(译注:所有字母大写,单词使用下划线分隔)。注意,所有常量都必须是static final成员,但并不是所有的static final成员都是常量。

    9、一个

    1.2 包名

    使用小写字母如 com.xxx.settlment,不要 com.xxx.Settlement
    单词间不要用字符隔开,比如 com.xxx.settlment.jsfutil,而不要com.xxx.settlement.jsf_util

    1.3 类名

    1.3.1 首字母大写

    类名要首字母大写,比如 SupplierService, PaymentOrderAction;不要 supplierService, paymentOrderAction.

    1.3.2 后缀

    类名往往用不同的后缀表达额外的意思,如下表:

    后缀名 意义 举例
    Service 表明这个类是个服务类,里面包含了给其他类提同业务服务的方法 PaymentOrderService
    Impl 这个类是一个实现类,而不是接口 PaymentOrderServiceImpl
    Inter 这个类是一个接口 LifeCycleInter
    Dao 这个类封装了数据访问方法 PaymentOrderDao
    Action 直接处理页面请求,管理页面逻辑了类 UpdateOrderListAction
    Listener 响应某种事件的类 PaymentSuccessListener
    Event 这个类代表了某种事件 PaymentSuccessEvent
    Servlet 一个Servlet PaymentCallbackServlet
    Factory 生成某种对象工厂的类 PaymentOrderFactory
    Adapter 用来连接某种以前不被支持的对象的类 DatabaseLogAdapter
    Job 某种按时间运行的任务 PaymentOrderCancelJob
    Wrapper 这是一个包装类,为了给某个类提供没有的能力 SelectableOrderListWrapper
    Bean 这是一个POJO MenuStateBean

    1.4 方法名

    首字母小写,如 addOrder() 不要 AddOrder()
    动词在前,如 addOrder(),不要orderAdd()
    动词前缀往往表达特定的含义,如下表:

  • Java: 继承多个接口

    2016-02-17 10:08:41

     

     

    1. 首先我们来实现一个简单的接口的定义。

    interface usb{

    public void print();

    }

    在接口中不可以实现函数的方法,也就是不可以如下这样做。

    interface usb{

    public void print(){

    System.out.println("helloworld");

    };

    }

    1. 接下来我们用一个类来实现这个接口。也就是一个具体化的过程,如下例。

    class computer implements usb{

    public void print() {

    System.out.println("i am a computer");

    }

    1. 接下来就可以在主函数中实现这个类了。如下例。

    public static void main(String[] args) {

       computer computer=new computer();

       computer.print();

    1. 接下来进行继承多个接口。如下例。

    interface usb{

    public void print();

    }

    interface call{

    public void callyou();

    }

    1. 下面用类来进行实现。如下例。

    class computer implements usb,call{

    public void print() {

    System.out.println("i am a computer");

    }

    public void callyou() {

    System.out.println("i will call");

    }

    }

    1. 主方法中再实现一下就可以了。

     

     

     

  • java: 子类同时继承类和接口

    2016-02-17 10:08:41

    从下面的例子的中,在应用中,是定义子类对象的,看不出子类所继承的接口好处,即使不写接口也是OK的。
     
    确实难以想象接口的好处,能想象出的就是很多的Libary接口都是开放interface,给出相关接口的参数情况,看不到具体的逻辑,是不是在封装的时候,有机制可以把其对应的类真正实现的逻辑隐藏起来,如果是这样子,interface有这个好处吧
     
    package edu.javase.buffer;

    interface faces {
    public void facefun1();

    public int facefun2();

    public String facefun3();
    }

    interface faces2 {
    public void facefun11();

    public int facefun22();

    public String facefun33();
    }

    class fatherz {
    public fatherz() {
    System.
    out.println("fatherz 构造器");
    }

    public fatherz(int i) {
    System.
    out.println("fatherz int i 构造器" + i);
    }

    public void fatherfun() {
    System.
    out.println("fatherfun");
    }

    }

    class demoface extends fatherz implements faces, faces2 {// 一旦集成必须实现所有接口
    public demoface() {
    super();
    System.
    out.println("demoface 构造器");
    }

    public demoface(int i) {
    super(
    1);
    System.
    out.println("demoface int i 构造器" + i);
    }

    @Override
    public void facefun1() {
    System.
    out.println("实现接口 facefun1");
    }

    @Override
    public int facefun2() {
    System.
    out.println("实现接口 facefun2");
    return 0;
    }

    @Override
    public String facefun3() {
    System.
    out.println("实现接口 facefun3");
    return null;
    }

    @Override
    public void facefun11() {
    System.
    out.println("实现接口 facefun11");
    }

    @Override
    public int facefun22() {
    System.
    out.println("实现接口 facefun22");
    return 0;
    }

    @Override
    public String facefun33() {
    System.
    out.println("实现接口 facefun33");
    return null;
    }
    }

    public class demointerface {
    public static void main(String[] args) {
    demoface dd
    = new demoface(); //定义的对象是子类的
    dd.facefun1();
    // 调用接口,并且实现
    dd.facefun2();
    dd.facefun3();

    dd.facefun11();
    dd.facefun22();
    dd.facefun33();
    System.
    out.println("----------------");

    demoface ff
    = new demoface(5);
    ff.fatherfun();
    // 同事继承父类
    }
    }
  • Java:不同package下相同类名的调用方法

    2016-02-16 15:27:25

    总结:从下面的验证结果来我们可以看到,程序会优先处理为import进来类对象,所以为了不引起混乱的情况,不管是否在本包下调用还是其他的包同时用到它们,我们在创建类对象的时候,所定义的对象new时都加入包名称,见下面最后的图示。
    良好的编码习惯也应该如此,避免将来发生同类名的情况。

     

     

    现在有两个类,它们名称相同,但所在的package不同。

    其结构如下图所示:

     

     

     

    两个class A的代码如下:

     

    1. package pka;  
    2. public class A {  
    3.     public void printA(){  
    4.         System.out.println("print:pka.A");  
    5.     }  
    6. }  

     

    1. package pkb;  
    2. public class A {  
    3.     public void printA(){  
    4.         System.out.println("print:pkb.A");  
    5.     }  
    6. }  

     

     

    另外Main.java为测试类:

    情况1:

    Main中调用pka.A

    Main代码如下:

     

    1. package pka;  
    2. public class Main {  
    3.     public static void main(String [] args){      
    4.         A a=new A();  
    5.         a.printA();       
    6.     }  
    7. }  

     

    测试结果为:

    print:pka.A

     

     

     

    情况2:

    当我们添加了对pkb.A的import之后,情况就不同了。

    Main代码如下:

     

     

    1. package pka;  
    2. import pkb.A;  
    3. public class Main {  
    4.     public static void main(String [] args){  
    5.       
    6.         A a=new A();  
    7.         a.printA();       
    8.     }  
    9. }  

     

    测试结果为:

    print:pkb.A

    此时通过A a=new A() ,创建的就不是本package中的A了,而是import进来的pkb中的A

     

    此时我们想要创建pka中的A的对象时就必须使用以下方式了:

    1. package pka;  
    2. import pkb.A;  
    3. public class Main {  
    4.     public static void main(String [] args){      
    5.         pka.A a=new pka.A();  
    6.         a.printA();//结果为print:pka.A        
    7.     }  
    8. }  

     

     

  • Java:打印函数print、println、printf

    2016-02-16 15:27:25

    package print.function.test;
    public class PrintFunction {
     
     public static void main(String[] args) {
         int i = 4;
         double j = 5;
         System.out.print("用print输出i=:"+ i); //没有逗号,但有加号 (不自动换行)
         System.out.println( "用println输出i=:"+ i); //没有逗号,但有加号 (可自动换行)
        
         //printf功能:不自动换行, 支持多个变量输出。 写法:有逗号,但没有加号,
         //同时需用%号加指定输出类型
          System.out.printf("i的值=%d,j的值=%f", i,j);
          System.out.println(); //换行
          System.out.printf("i的值=%d,j的值=%.2f", i,j);
          System.out.println(); //换行
     
          //%d是输出int,%f是输出double类型,不够则自动填补,%.2f截取2位
       //有"%s"是一个字符串值的点位符的意思。"%c"是一个字符值的点位符的意思。
      }
    }
     
    运行结果为
    用print输出i=:4用println输出i=:4
    i的值=4,j的值=5.000000
    i的值=4,j的值=5.00
  • 如何做好测试

    2015-08-13 15:06:53

    如何做好测试,保证质量和保证进度?
     
    我认为:
    1、需求阶段:对于业务熟悉,从需求阶段发现需求缺陷。即使对业务不熟悉,也要多想多问。
    2、程序设计阶段:对系统架构、程序熟悉,了解开发设计,发现开发设计上不足,甚至可引导开发设计。
    3、案例设计阶段:居于第2点的基础,用精简的案例来覆盖
    4、执行阶段:等价类、边界值不必用手动执行,而是看代码做静态测试。能够调试出开发错误代码,并给出修复方式就更牛了。
    5、最后最高境界:能够根据的系统特点,设计自动化案例运行,但必须考虑投入与产出,以及重用性和维护成本。
  • 如何面试软件测试人员?

    2015-04-30 14:44:10

    如何面试软件测试人员?

    1.    首先一般都是比较老套点的问题:介绍一下你的经历。

      考察表达能力

    1. 公司产品,具体应用什么编程技术?具体的架构是?具体的应用场景有哪些?

     重点考察测试人员对以往的工作所负责的产品测试,是否具备一定的深度!通常我都是让面试者自己讲述或是在纸上画出具体系统架构的图!

    1. 公司测试团队的规模如何,具体你所处的角色是什么?

    重点考察测试人员在以往的公司测试团队中,具体的工作职责,评判其工作是否与当要求职位是否符合?是否有哪些优缺点?

    1. 请说出一个你以前参与项目,对你测试经验提升很高的,具体是哪方面?

    重点考察测试人员在以往的测试工作中能力提升方面,有哪些?然后重点询问此部分内容,是否测试经验增长,具备一定的深度?

    1. 通常做测试时会碰到,提交的某个bug开发人员不认同你的观点?这时你如何办?

    重点考察测试人员是否坚持自已的价值观?是否具备协调沟通处理问题能力?

    1. 一个项目测试结束,有没什么经验总结?如果有,具体是如何开展的?

    重点考察测试人员对自己能力提升方面,有没有提高总结的地方,从项目中吸取的经验与教训。从中可以看出来,测试人员是否属行自我驱动型人才!

    1. 特定测试技术考察:性能测试,安全性测试,自动化测试等以前有开展过没?如果有,具体是如何实施的?

    重点考察测试人员技术能力,是否在各方面都有所涉及?或是在各方面技术上都有一定深度?当然从中也能看出一个测试人员是否属于是技术路线发展方向!

    1. 如果安排一项测试技术研究工作,你如何应对?

    重点考察测试人员是否具体测试技术专研精神?是否喜欢接受挑战?是否属于以后培养骨干对象?

    1. 某个项目上线后,出现问题,恰巧你是负责的,你如何应对这突如其来的事件?

    重点考察测试人员应对问题的压力,责任感,及如何处理项目上线后的技术问题及应对解决能力。

    1. 有没有看过什么测试书,具体是哪本?带给你的收获是?

    重点考察测试人员是否为测试这个职业肯付出多少?从中也可以看出这个测试人员是否上进心?是否有求知心?我的定义是如果哪个应聘者来面试时,都没系统的看过一本测试书籍,基本上不会录取!

    1. 为什么会选择做测试这份工作?

     重点考察测试人员对待测试工作的态度及是否有发展潜力?面试过很多测试人员,经常见到的回答,自己是女孩子,做测试细心,各位你认为这样回答你会满意吗?其码不是我想要的答案!

    1. 周末放假有什么业余爱好?

     重点考察面试测试人员性格特质,测试工作本身就是复杂且富有技术性的工作,而且不同的职位所需要的测试人员性格品质差异性很大。

    1. 你自己所期待加入的测试团队是什么样的?

    重点考察测试人员在以前测试团队中有哪些不协调?当然最重要的是也能提供给你一些信息,这个员工以后如何更好的管理与沟通!

    1. 你最近3-5年的职业规划是什么?

     重点考察软件测试人员的职业发展方向是否与当前职位招聘相符? 从其中可以侧面看出来其员工稳定性。

     

  • 如何面试软件测试人员

    2015-04-30 14:44:10

    如何面试软件测试人员?

    1.    首先一般都是比较老套点的问题:介绍一下你的经历。

    HOHO......这个问题我想谁都被问过吧,注意一下重点,不要紧张慢慢说就OK了。

    1. 公司产品,具体应用什么编程技术?具体的架构是?具体的应用场景有哪些?

     重点考察测试人员对以往的工作所负责的产品测试,是否具备一定的深度!通常我都是让面试者自己讲述或是在纸上画出具体系统架构的图!

    1. 公司测试团队的规模如何,具体你所处的角色是什么?

    重点考察测试人员在以往的公司测试团队中,具体的工作职责,评判其工作是否与当要求职位是否符合?是否有哪些优缺点?

    1. 请说出一个你以前参与项目,对你测试经验提升很高的,具体是哪方面?

    重点考察测试人员在以往的测试工作中能力提升方面,有哪些?然后重点询问此部分内容,是否测试经验增长,具备一定的深度?

    1. 通常做测试时会碰到,提交的某个bug开发人员不认同你的观点?这时你如何办?

    重点考察测试人员是否坚持自已的价值观?是否具备协调沟通处理问题能力?

    1. 一个项目测试结束,有没什么经验总结?如果有,具体是如何开展的?

    重点考察测试人员对自己能力提升方面,有没有提高总结的地方,从项目中吸取的经验与教训。从中可以看出来,测试人员是否属行自我驱动型人才!

    1. 特定测试技术考察:性能测试,安全性测试,自动化测试等以前有开展过没?如果有,具体是如何实施的?

    重点考察测试人员技术能力,是否在各方面都有所涉及?或是在各方面技术上都有一定深度?当然从中也能看出一个测试人员是否属于是技术路线发展方向!

    1. 如果安排一项测试技术研究工作,你如何应对?

    重点考察测试人员是否具体测试技术专研精神?是否喜欢接受挑战?是否属于以后培养骨干对象?

    1. 某个项目上线后,出现问题,恰巧你是负责的,你如何应对这突如其来的事件?

    重点考察测试人员应对问题的压力,责任感,及如何处理项目上线后的技术问题及应对解决能力。

    1. 有没有看过什么测试书,具体是哪本?带给你的收获是?

    重点考察测试人员是否为测试这个职业肯付出多少?从中也可以看出这个测试人员是否上进心?是否有求知心?我的定义是如果哪个应聘者来面试时,都没系统的看过一本测试书籍,基本上不会录取!

    1. 为什么会选择做测试这份工作?

     重点考察测试人员对待测试工作的态度及是否有发展潜力?面试过很多测试人员,经常见到的回答,自己是女孩子,做测试细心,各位你认为这样回答你会满意吗?其码不是我想要的答案!

    1. 周末放假有什么业余爱好?

     重点考察面试测试人员性格特质,测试工作本身就是复杂且富有技术性的工作,而且不同的职位所需要的测试人员性格品质差异性很大。

    1. 你自己所期待加入的测试团队是什么样的?

    重点考察测试人员在以前测试团队中有哪些不协调?当然最重要的是也能提供给你一些信息,这个员工以后如何更好的管理与沟通!

    1. 你最近3-5年的职业规划是什么?

     重点考察软件测试人员的职业发展方向是否与当前职位招聘相符? 从其中可以侧面看出来其员工稳定性。

     

  • 好的测试工程师应具备的素质

    2015-04-30 14:44:10

    增加: 主动/积极性、业务能力、毅力(坚持与原则)

     

    好的测试工程师应具备的素质

    文章出处:天极论坛 作者:不详 发布时间:2006-01-27

      人是测试工作中最有价值也是最重要的资源,没有一个合格的、积极的测试小组,测试就不可能实现。然而,在软件开发产业中有一种非常普遍习惯,那就是让那些经验最少的新手、没有效率的开发者或不适合干其他工作的人去做测试工作。这绝对是一种目光短浅的行为,对一个系统进行有效的测试所需要的技能绝对不比进行软件开发需要的少,事实上,测试者将获得极其广泛的经验,他们将遇到许多开发者不可能遇到的问题。

      ①、沟通能力

      一名理想的测试者必须能够同测试涉及到的所有人进行沟通,具有与技术(开发者)和非技术人员(客户,管理人员)的交流能力。既要可以和用户谈得来,又能同开发人员说得上话,不幸的是这两类人没有共同语言。和用户谈话的重点必须放在系统可以正确地处理什么和不可以处理什么上。而和开发者谈相同的信息时,就必须将这些活重新组织以另一种方式表达出来,测试小组的成员必须能够同等地同用户和开发者沟通。

      ②、移情能力

      和系统开发有关的所有人员都处在一种既关心又担心的状态之中。用户担心将来使用一个不符合自己要求的系统,开发者则担心由于系统要求不正确而使他不得不重新开发整个系统,管理部门则担心这个系统突然崩溃而使它的声誉受损。测试者必须和每一类人打交道,因此需要测试小组的成员对他们每个人都具有足够的理解和同情,具备了这种能力可以将测试人员与相关人员之间的冲突和对抗减少到最低程度。

      ③、技术能力

      就总体言,开发人员对那些不懂技术的人持一种轻视的态度。一旦测试小组的某个成员作出了一个错误的断定,那么他们的可信度就会立刻被传扬了出去。一个测试者必须既明白被测软件系统的概念又要会使用工程中的那些工具。要做到这一点需要有几年以上的编程经验,前期的开发经验可以帮助对软件开发过程有较深入的理解,从开发人员的角度正确的评价测试者,简化自动测试工具编程的学习曲线。

      ④、自信心

      开发者指责测试者出了错是常有的事,测试者必须对自己的观点有足够的自信心。如果容许别人对自己指东指西,就不能完成什么更多的事情了。

      ⑤、外交能力

      当你告诉某人他出了错时,就必须使用一些外交方法。机智老练和外交手法有助于维护与开发人员的协作关系,测试者在告诉开发者他的软件有错误时,也同样需要一定的外交手腕。如果采取的方法过于强硬,对测试者来说,在以后和开发部门的合作方面就相当于“赢了战争却输了战役”。

      ⑥、幽默感

      在遇到狡辩的情况下,一个幽默的批评将是很有帮助的。

      ⑦、很强的记忆力

      一个理想的测试者应该有能力将以前曾经遇到过的类似的错误从记忆深处挖掘出来,这一能力在测试过程中的价值是无法衡量的。因为许多新出现的问题和我们已经发现的问题相差无几。

      ⑧、耐心

      一些质量保证工作需要难以置信的耐心。有时你需要花费惊人的时间去分离、识别和分派一个错误。这个工作是那些坐不住的人无法完成的。

      ⑨、怀疑精神

      可以预料,开发者会尽他们最大的努力将所有的错误解释过去。测式者必须听每个人的说明,但他必须保持怀疑直到他自己看过以后。

      ⑩、自我督促

      干测试工作很容易使你变得懒散。只有那些具有自我督促能力的人才能够使自己每天正常地工作。

      11、洞察力/敏感度(me)

      一个好的测试工程师具有“测试是为了破坏”的观点,捕获用户观点的能力,强烈的质量追求,对细节的关注能力。应用的高风险区的判断能力以便将有限的测试针对重点环节。

  • 【转】Appium IOS 自动化测试初探

    2014-09-10 17:17:52

     

    原文地址:

    http://blog.csdn.net/soulery/article/details/25281551

    手机平台的自动化测试工具很多,之前研究过了安卓和苹果的原生自动化测试框架,经一些同事介绍,貌似Appium是个不错的工具。

    想记录一下研究的结果,也算是篇干货的文章

    在网上也看了一些视频,个人认为这个自动化测试的特点就是


    1. 多编程语言支持

    相对于传统的IOS UIautomation只能支持js语言,Appium起到了一个翻译的作用,它其实是一个CS架构,服务器和IOS模拟器或真机直接通讯,客户端和服务器之间用HTTP协议进行交互,所以客户端用什么语言其实不重要。下面会有一个python编程的实际例子。


    2. 远程测试支持

    正如上面说的,客户端和服务器之间用HTTP协议通讯,那么也就是说,客户端可以和服务器在同一台机器或者不同的机器。


    3. 较好的录制功能

    Appium提供了一个很好的录制工具,可以让程序员一步一步的把步骤进行精确的录制


    4. 单步调试

    程序员可以利用高级脚本语言,比如Python对被测程序进行单步调试,比如一条命令对应一个UI动作


    如何使用appium,基于2014年5月份发布的appium 1.0来说,大约是这样的,

    你必须要有xcode进行自动化测试的基础,如果没有的话,请先补习


    A. 如果是模拟器测试

    1. 选择应用安装包的位置

    2. 再选择期望的模拟器平台,IOS版本,再点Launch就可以了



    3. Launch之后会发现什么都没有,其实Appium已经运行了,请注意运行的窗口中有没有错误

    4. 下面就是录测试用例,点击一个蓝色的底,白色的i的按钮

    5. 过一段时间后就会出现inspector的窗口



    6. 下面是一个例子,比如我要点一个按钮,

         6.1 首先现在左边的树形窗口里面找到一个按钮的位置,有点类似Firebug找网页控件

         6.2 然后在下面的动作框选择你想要的动作,点击就是Tap,然后你会发现这个按钮真的被点击了(这是一个单步调试很直观的例子)



    7. 如何把录制变成脚本

    7.1 首先要点击inspector窗口的Record按钮

    7.2 选择你需要的编程语言

    7.3 再继续重复你需要做的UI操作

    7.4 最后就是把代码拷贝出去



    8. 如何重录测试

    8.1 关掉inspector,

    8.2 代码需要稍微的修改,Python的代码录出来居然有语法错误,这里给个例子,对照看就好了(当然必要的python库必须安装)

    1. from selenium.webdriver.firefox.webdriver import WebDriver  
    2. from selenium.webdriver.common.action_chains import ActionChains  
    3. import time  
    4. import os  
    5. import selenium  
    6.   
    7. success = True  
    8. desired_caps = {}  
    9. desired_caps['browserName'] = 'iOS'  
    10. desired_caps['platform'] = 'Mac'  
    11. desired_caps['version'] = '6.1'  
    12. desired_caps['device'] = 'iPad'  
    13. desired_caps['app'] = os.path.abspath('/Users/marshall/Library/Developer/Xcode/DerivedData/TestAutomation-empzzpwyyxctxidnwdsrtlssueqi/Build/Products/Debug-iphonesimulator/TestAutomation.app')  
    14.   
    15. wd = selenium.webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)  
    16. wd.implicitly_wait(60)  
    17.   
    18. def is_alert_present(wd):  
    19.     try:  
    20.         wd.switch_to_alert().text  
    21.         return True  
    22.     except:  
    23.         return False  
    24.   
    25. try:  
    26.     wd.find_element_by_name("First").click()  
    27.     wd.find_element_by_name("Second").click()  
    28. finally:  
    29.     wd.quit()  
    30.     if not success:  
    31.         raise Exception("Test failed.")  

    8.3 运行代码,查看测试结果


    B. 如果是真机测试

    真机测试其实遇到了些问题,我大概说一下我的步骤

    1. 配置应用的BundleID和设备的UDID



    BundleID不知道怎么看的请用itools

    UDID不知道怎么找的请用iTunes或itools

    应用必须是你自己的开发者账号签名过的


    2. Launch Appium


    3. 点击inspector的按钮,接下来应用会显示在iPad上,但是过一会就会闪退(我试了好几个应用都有这个问题),我已经给Appium报告了一个bug,看看会不会有回复吧。

    如果有人在真机上成功使用inspector的,也请留言分享一下



  • 好多年没上。。。

    2014-08-19 14:29:45

    好多年没上。。。
    看着曾经的感悟,非常感触,甚至有点想哭...
  • 寻求发展渠道

    2014-08-19 14:29:45

    Taobao 怎样打败易趣

    后感:

      1)不要想着封杀别人,要想着怎么增强壮大自己;

      2)狭路中寻求自己的特色;

      3)不可忽视低端的大众;

     

    Wechat 怎样做起来(wechat 不是这类型产品的第一个,米聊都比他早,但是张小龙有QQ mail 的成功运营经验)

    后感:

    1)wechat是微信;

    2)获悉客户的心态,做好宣导和服务支持。

     

    Gmail 怎样打败yahoo mail

541/3123>
Open Toolbar